瀏覽代碼

Merge branch 'master' into Branch_qinhb

qinhb 1 年之前
父節點
當前提交
0173d231ef

+ 2 - 0
package.json

@@ -61,7 +61,9 @@
     "sockjs-client": "1.6.1",
     "sortablejs": "^1.15.2",
     "stompjs": "^2.3.3",
+    "uuid": "^9.0.1",
     "vue": "^3.4.21",
+    "vue-draggable-plus": "^0.4.0",
     "vue-i18n": "9.9.1",
     "vue-pdf-embed": "^2.0.2",
     "vue-router": "^4.3.0",

+ 17 - 0
src/api/bom/index.ts

@@ -0,0 +1,17 @@
+import request from "@/utils/request";
+import { AxiosPromise } from "axios";
+import { BomInfo} from "./types";
+
+/**
+ * 修改用户
+ *
+ * @param id
+ * @param data
+ */
+export function getList(data: BomInfo) {
+  return request({
+    url: "/api/v1/base/materialBom/list",
+    method: "post",
+    data: data,
+  });
+}

+ 3 - 0
src/api/bom/types.ts

@@ -0,0 +1,3 @@
+export interface BomInfo {
+  materialCode?: string;
+}

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

@@ -0,0 +1,9 @@
+import request from "@/utils/request";
+
+// 返回一工段为
+export function processTreeList() {
+  return request({
+    url: "/api/v1/op/baseOperation/treeList",
+    method: "post",
+  });
+}

+ 9 - 0
src/api/craft/route/index.ts

@@ -1,5 +1,6 @@
 import request from "@/utils/request";
 
+// 复制工艺路线
 export function copyRoute(id: string) {
   return request({
     url: "/api/v1/op/route/copyAdd",
@@ -7,3 +8,11 @@ export function copyRoute(id: string) {
     data: { id: id },
   });
 }
+
+// 获取工艺路线 工序关系表信息
+export function processesByRouteId(id: string) {
+  return request({
+    url: `/api/v1/op/routeOperation/get/${id}`,
+    method: "get",
+  });
+}

+ 17 - 0
src/api/workShop/index.ts

@@ -0,0 +1,17 @@
+import request from "@/utils/request";
+import { AxiosPromise } from "axios";
+import { WorkShopInfo} from "./types";
+
+/**
+ * 修改用户
+ *
+ * @param id
+ * @param data
+ */
+export function getBomList(data: WorkShopInfo) {
+  return request({
+    url: "/api/v1/base/materialBom/list",
+    method: "post",
+    data: data,
+  });
+}

+ 4 - 0
src/api/workShop/types.ts

@@ -0,0 +1,4 @@
+export interface WorkShopInfo {
+  id?: number;
+  parentId?: number;
+}

+ 44 - 3
src/components/CommonTable/configs/tableConfig.ts

@@ -126,13 +126,54 @@ export const tableConfig = {
   },
 
   FACTORY: {
-    url: "xxxxxxx",
+    url: "/api/v1/base/workShop",
     column: [
       {
-        label: "xxxxxxx",
-        prop: "xxxxxxxx",
+        label: "车间名称",
+        prop: "name",
         search: true,
       },
+      {
+        label: "车间负责人",
+        prop: "manager",
+        rules: [{
+          required: true,
+          message: "请选择厂区负责人",
+          trigger: "blur"
+        }],
+        type: 'select',
+        dicUrl:import.meta.env.VITE_APP_BASE_API+"/api/v1/sys/user/list",
+        dicMethod:"post",
+        props: {
+          label: "userName", // 下拉菜单显示的字段
+          value: "userName" // 下拉菜单值的字段
+        },
+      },
+      {
+        label: "车间位置",
+        prop: "position",
+      },
+      {
+        label: "所属工厂",
+        prop: "factoryName",
+        display:false
+      },
+      {
+        label: "车间描述",
+        prop: "remark",
+      },
+      {
+        label: "创建人",
+        prop: "creator",
+        display:false
+      },
+      {
+        label: "创建时间",
+        prop: "created",
+        display:false
+      },
     ],
   },
+
+
 };

+ 2 - 1
src/layout/components/AppMain/index.vue

@@ -29,7 +29,8 @@ const cachedViews = computed(() => useTagsViewStore().cachedViews); // 缓存页
   width: 100%;
   min-height: calc(100vh - $navbar-height);
   overflow: hidden;
-  background-color: var(--el-bg-color-page);
+  // background-color: var(--el-bg-color-page);
+  background-color: #f5f9ff;
 }
 
 .hasTagsView .app-main {

+ 1 - 1
src/store/modules/dictionary.ts

@@ -30,7 +30,7 @@ export const useDictionaryStore = defineStore("dictionaryStore", {
     strategies: [
       {
         key: "dicts",
-        storage: sessionStorage,
+        storage: localStorage,
         paths: ["dicts"],
       },
     ],

+ 35 - 0
src/views/base/bom/columns.ts

@@ -0,0 +1,35 @@
+import { useDictionaryStoreHook } from "../../../store/index";
+const { dicts } = useDictionaryStoreHook();
+export const columns = [
+
+  {
+    label: "物料编码",
+    prop: "materialCode",
+    hide:true
+  },
+
+  {
+    label: "物料名称",
+    prop: "materialName",
+    hide:true
+  },
+
+  {
+    label: "物料编码",
+    prop: "bomMaterialCode",
+  },
+  {
+    label: "物料名称",
+    prop: "bomMaterialName",
+  },
+  {
+    label: "物料属性",
+    prop: "bomMaterialAttribute",
+  },
+  {
+    label: "物料数量",
+    prop: "bomMaterialNumber",
+  },
+
+
+];

+ 188 - 0
src/views/base/bom/index.vue

@@ -0,0 +1,188 @@
+<template>
+  <div class="mainContentBox">
+    <avue-crud
+      ref="crudRef"
+      v-model:search="search"
+      v-model="form"
+      :data="data"
+      :option="option"
+      v-model:page="page"
+      @row-update="updateRow"
+      @row-del="deleteRow"
+      @search-change="searchChange"
+      @search-reset="resetChange"
+      @size-change="dataBomList"
+      @current-change="dataBomList"
+      @selection-change="selectionChange"
+    >
+      <template #menu-left="{ size }">
+        <el-button
+          type="danger"
+          icon="el-icon-plus"
+          @click="openMaterial"
+          >新增</el-button
+        ></template>
+        <template #menu="{row,index,type}">
+          <el-button @click="binding(row)"
+                     icon="el-icon-link"
+                     text
+                     type="primary"
+          >BOM</el-button>
+        </template>
+        <CommonTable
+          ref="ctableRef"
+          tableTitle="绑定子项"
+          tableType="BOM"
+          @selected-sure="onSelectedFinish"
+        />
+
+      <template #menu-right="{}">
+        <el-dropdown split-button
+          >导入
+          <template #dropdown>
+            <el-dropdown-menu>
+              <el-dropdown-item
+                @click="downloadTemplate('/api/v1/plan/order/template')"
+              >
+                <i-ep-download />下载模板
+              </el-dropdown-item>
+              <el-dropdown-item @click="importExcelData">
+                <i-ep-top />导入数据
+              </el-dropdown-item>
+            </el-dropdown-menu>
+          </template>
+        </el-dropdown>
+        <el-button
+          class="ml-3"
+          @click="exportData('/api/v1/plan/order/export')"
+        >
+          <template #icon> <i-ep-download /> </template>导出
+        </el-button>
+      </template>
+    </avue-crud>
+    <CommonTable
+      ref="ctableRef"
+      tableTitle="绑定子项"
+      tableType="MARTERIAL"
+      @selected-sure="onSelectedFinish"
+    />
+
+  </div>
+</template>
+<script setup lang="ts">
+import { ref, getCurrentInstance } from "vue";
+import { useCrud } from "../../../hooks/userCrud";
+import ButtonPermKeys from "../../../common/configs/buttonPermission";
+import { columns } from "./columns";
+import { useCommonStoreHook, useDictionaryStoreHook } from "../../../store/index";
+import {
+  getList,
+} from "@/api/bom";
+const { isShowTable, tableType } = toRefs(useCommonStoreHook());
+// 数据字典相关
+const { dicts } = useDictionaryStoreHook();
+const router = useRouter();
+const route = useRoute();
+const test = () => {
+  isShowTable.value = true;
+  tableType.value = tableType.value == 1 ? 2 : 1;
+};
+
+const openMaterial=()=>{
+  if (ctableRef.value) {
+    ctableRef.value.startSelect();
+  }
+}
+const formData=ref({});
+const dataBomList=()=>{
+  formData.materialCode=route.params.materialCode;
+  getList(formData).then((data: any) => {
+    ElMessage({
+      message: data.msg,
+      type: "success",
+    });
+    // 上传完成后的刷新操作
+    page.currentPage = 1;
+    dataList();
+  });
+}
+
+const ctableRef = ref(null);
+
+const binding = (row) => {
+  if (ctableRef.value) {
+    ctableRef.value.startSelect();
+  }
+};
+const dialog = reactive({
+  title: "绑定子项",
+  visible: false,
+});
+// 传入一个url,后面不带/
+const { form, data, option, search, page, toDeleteIds, Methords, Utils } =
+  useCrud({
+    src: "/api/v1/base/materialBom",
+  });
+const { dataList, createRow, updateRow, deleteRow, searchChange, resetChange } =
+  Methords; //增删改查
+const { selectionChange, multipleDelete } = Methords; //选中和批量删除事件
+const { checkBtnPerm, downloadTemplate, exportData } = Utils; //按钮权限等工具
+// checkBtnPerm(ButtonPermKeys.PLAN.BTNS.order_add) :permission="permission"
+// const permission = reactive({
+//   delBtn: checkPerm(buttonPermission.PLAN.BTNS.order_del),
+//   addBtn: checkPerm(buttonPermission.PLAN.BTNS.order_add),
+//   editBtn: checkPerm(buttonPermission.PLAN.BTNS.order_edit),
+//   menu: true,
+// });
+
+const crudRef = ref(null); //crudRef.value 获取avue-crud对象
+
+onMounted(() => {
+  // console.log("crudRef", crudRef)
+  formData.materialCode=route.params.materialCode;
+  getList(formData).then((data: any) => {
+    ElMessage({
+      message: data.msg,
+      type: "success",
+    });
+    // 上传完成后的刷新操作
+    page.currentPage = 1;
+    dataList();
+  });
+});
+
+/**
+ * 上传excel相关
+ */
+const uploadRef = ref(null);
+const uploadFinished = () => {
+  // 上传完成后的刷新操作
+  page.currentPage = 1;
+  dataList();
+};
+const importExcelData = () => {
+  if (uploadRef.value) {
+    uploadRef.value.show("/api/v1/plan/order/import");
+  }
+};
+
+// 设置表格列或者其他自定义的option
+option.value = Object.assign(option.value, {
+  selection: true,
+  column: columns,
+});
+
+const onSelectedFinish = (selectedValue) => {
+ /* formData.id=selectedValue.id;
+  formData.parentId=factory.value.id;
+  updateWorkShop(formData).then((data: any) => {
+    ElMessage({
+      message: data.msg,
+      type: "success",
+    });
+    // 上传完成后的刷新操作
+    page.currentPage = 1;
+    dataList();
+  });*/
+};
+</script>

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

@@ -283,7 +283,7 @@ option.value = Object.assign(option.value, {
       prop: "stanType",
       search: true,
       type: "select",
-      dicData: dicts.cubicle_type,
+      dicData: dicts.station_type,
       props: {
         label: "dictLabel",
         value: "dictValue",

+ 328 - 0
src/views/base/craftManagement/route/bindProcess.vue

@@ -0,0 +1,328 @@
+<template>
+  <div
+    class="mainContentBox"
+    style="padding: 0; box-shadow: 0px 2px 4px 0px rgba(0, 0, 0, 0.1)"
+  >
+    <div class="header">
+      <div class="title">绑定工序</div>
+      <el-space>
+        <el-button :icon="Back" size="small">返回</el-button>
+        <el-button type="primary" :icon="Download" size="small">下载</el-button>
+        <el-button
+          type="primary"
+          :icon="Document"
+          size="small"
+          @click="saveFlow"
+          >保存</el-button
+        >
+      </el-space>
+    </div>
+    <div class="binContainer">
+      <div class="processTree">
+        <el-collapse v-model="activeNames">
+          <el-collapse-item
+            v-for="(pProcess, pIndex) in list1"
+            :key="pProcess.workSection"
+            :name="pIndex"
+          >
+            <template #title>
+              <div class="title2">
+                {{ getNameByDictType(pProcess.workSection) }}
+              </div>
+            </template>
+            <div class="treeChild">
+              <VueDraggable
+                v-model="pProcess.baseOperationList"
+                :animation="150"
+                :group="{ name: 'people', pull: 'clone', put: false }"
+                :sort="false"
+                :clone="clone"
+              >
+                <div
+                  class="childItem"
+                  v-for="(item, index) in pProcess?.baseOperationList"
+                  :key="item.id"
+                >
+                  {{ item.operationName }}
+                </div>
+              </VueDraggable>
+            </div>
+          </el-collapse-item>
+        </el-collapse>
+      </div>
+      <div class="flowBox">
+        <VueDraggable
+          v-model="list2"
+          :animation="150"
+          group="people"
+          style="min-width: 400px"
+        >
+          <div
+            v-for="(item, index) in list2"
+            :key="item.uuid"
+            class="flowItem"
+            @click="clickFlowItem(item, index)"
+          >
+            <div class="indexLabel">工序 {{ index + 1 }}</div>
+            <div :class="getFlowNameClass(index)">
+              {{ item?.operationVO?.operationName }} 当前id:{{
+                item?.operationId
+              }}
+              下id:{{ item?.nextOperationId }}
+            </div>
+            <div>
+              <Delete class="flowDelete" @click.stop="clickDelete(index)" />
+            </div>
+            <Bottom class="arrow" v-show="index < list2.length - 1" />
+          </div>
+        </VueDraggable>
+      </div>
+      <div class="detailInfo">3</div>
+    </div>
+  </div>
+</template>
+<script setup lang="ts">
+import {
+  Back,
+  Download,
+  Document,
+  Delete,
+  Bottom,
+} from "@element-plus/icons-vue";
+import { VueDraggable } from "vue-draggable-plus";
+import { processTreeList } from "@/api/craft/process/index";
+import { useCommonStoreHook, useDictionaryStoreHook } from "@/store";
+import { processesByRouteId } from "@/api/craft/route/index";
+import { v4 as uuidv4 } from "uuid";
+const router = useRouter();
+const route = useRoute();
+
+// 数据字典相关
+const { dicts } = useDictionaryStoreHook();
+
+// 顶部====================
+const back = () => {};
+
+const download = () => {};
+
+const save = () => {};
+
+// 左侧工序树====================
+const activeNames = ref([0]);
+const handleChange = (val) => {};
+
+const list1 = ref([]);
+
+const clone = (origin) => {
+  const data = JSON.parse(JSON.stringify(origin));
+  return {
+    created: "",
+    creator: "",
+    deleted: 0,
+    deptId: "",
+    id: "",
+    uuid: uuidv4(),
+    nextOperationId: "", //下一工序id
+    operationId: "", //	当前工序id
+    operationSort: 0, //当前工序排序号
+    operationVO: data,
+    orgId: "",
+    processRouteId: route.params.id, //工艺路线id
+    updated: "",
+    updator: "",
+    virtualCode: "",
+  };
+};
+
+const saveFlow = () => {
+  for (let i = 0; i < list2.value.length; i++) {
+    list2.value[i].operationSort = i;
+    list2.value[i].operationId = list2.value[i]?.operationVO?.id;
+    if (i === list2.value.length - 1) {
+      list2.value[i].nextOperationId = "";
+    } else {
+      list2.value[i].nextOperationId = list2.value[i + 1]?.operationVO?.id;
+    }
+  }
+};
+
+const loadTreeData = () => {
+  processTreeList().then((res) => {
+    list1.value = res.data ?? [];
+  });
+};
+
+// 中间列表====================
+const list2 = ref([]);
+const selectIndex = ref(-1);
+
+const clickFlowItem = (item, index) => {
+  selectIndex.value = index;
+  console.log("clickFlowItem", item);
+};
+
+const clickDelete = (index) => {
+  list2.value.splice(index, 1);
+};
+
+const getFlowNameClass = (index) => {
+  return index === selectIndex.value ? "nameLabelSelect" : "nameLabelCommon";
+};
+
+const loadProcessesFlow = () => {
+  processesByRouteId(route.params.id).then((res) => {
+    console.log("processesByRouteId", res);
+    list2.value = res.data ?? [];
+  });
+};
+
+// 右侧具体信息====================
+
+// 全局=======
+
+onMounted(() => {
+  loadTreeData();
+  loadProcessesFlow();
+});
+
+const getNameByDictType = (dictValue) => {
+  let str = "";
+  dicts?.workshop_section?.forEach((element) => {
+    if (element?.dictValue === dictValue) {
+      str = element?.dictLabel ?? "===";
+    }
+  });
+  return str;
+};
+</script>
+
+<style lang="scss" scoped>
+.binContainer {
+  height: calc(100vh - 165px);
+  background-color: #f5f7f9;
+  overflow-y: scroll;
+  // background-color: white;
+  padding: 0;
+  display: flex;
+}
+
+.header {
+  height: 50px;
+  display: flex;
+  background-color: #f5f7f9;
+  justify-content: space-between;
+  align-items: center;
+  border-bottom: 1px solid rgba(0, 0, 0, 0.1);
+}
+
+.processTree {
+  width: 220px;
+  height: 100%;
+  border-right: 1px solid rgba(0, 0, 0, 0.1);
+  .treeChild {
+    background: #f2f2f2;
+    padding: 20px 8px 10px 8px;
+    .childItem {
+      width: 100%;
+      height: 28px;
+      background: #ffffff;
+      border-radius: 4px 4px 4px 4px;
+      border: 1px solid rgba(35, 32, 50, 0.1);
+      margin-bottom: 10px;
+      text-align: center;
+    }
+  }
+}
+
+.flowBox {
+  flex: 1;
+  display: flex;
+  justify-content: center;
+  overflow-y: auto;
+  padding-top: 47px;
+  .flowContain {
+    width: 400px;
+
+    min-height: 200px;
+  }
+  .flowItem {
+    height: 50px;
+    width: 400px;
+    margin-bottom: 20px;
+    display: flex;
+    justify-content: space-between;
+    position: relative;
+    .indexLabel {
+      line-height: 50px;
+
+      font-size: 14px;
+      color: #6e7993;
+
+      text-align: left;
+    }
+    .nameLabelCommon {
+      width: 299px;
+      line-height: 50px;
+      background: #ffffff;
+      box-shadow: 0px 0px 4px 0px rgba(0, 0, 0, 0.5);
+      border-radius: 4px 4px 4px 4px;
+      border: 1px solid #232032;
+      text-align: center;
+    }
+    .nameLabelSelect {
+      width: 299px;
+      line-height: 50px;
+      background: rgba(10, 89, 247, 0.2);
+      box-shadow: 0px 0px 4px 0px rgba(0, 0, 0, 0.5);
+      border-radius: 4px 4px 4px 4px;
+      border: 2px solid #0a59f7;
+      text-align: center;
+    }
+    .flowDelete {
+      width: 1em;
+      height: 1em;
+      color: red;
+      visibility: hidden;
+    }
+    .arrow {
+      position: absolute;
+      width: 10px;
+      height: 18px;
+      top: 50px;
+      left: 50%;
+    }
+  }
+  .flowItem:hover {
+    .flowDelete {
+      visibility: visible;
+    }
+  }
+}
+
+.detailInfo {
+  width: 300px;
+  height: 100%;
+  border-left: 1px solid rgba(0, 0, 0, 0.1);
+}
+
+.title {
+  line-height: 44px;
+  color: #6f7991;
+  font-size: 14px;
+  font-weight: bold;
+  text-align: left;
+  margin-left: 20px;
+}
+.title2 {
+  color: #232032;
+  font-size: 14px;
+  text-align: left;
+  margin-left: 19px;
+}
+</style>
+
+<style>
+.el-collapse-item__content {
+  padding: 0;
+}
+</style>

+ 5 - 6
src/views/base/craftManagement/route/index.vue

@@ -29,11 +29,7 @@
           @click="copyRow(row)"
           >复制</el-button
         >
-        <el-button
-          link
-          icon="el-icon-copy-document"
-          :disabled="row.usable == '1' ? false : true"
-          @click="bindProcess(row)"
+        <el-button link icon="el-icon-copy-document" @click="bindProcess(row)"
           >绑定</el-button
         >
       </template>
@@ -124,8 +120,11 @@ const copyRow = (row) => {
   });
 };
 
+const router = useRouter();
 // 绑定工序
-const bindProcess = (row) => {};
+const bindProcess = (row) => {
+  router.push(`/base/craftManagement/bindProcess/${row.id}`);
+};
 
 // 设置表格列或者其他自定义的option
 option.value = Object.assign(option.value, {

+ 0 - 1
src/views/base/materials/columns.ts

@@ -1,6 +1,5 @@
 import { useDictionaryStoreHook } from "@/store";
 const { dicts } = useDictionaryStoreHook();
-import dictDataUtil from "@/common/configs/dictDataUtil";
 export const columns = [
   { label: "物料编码", prop: "materialCode", search: true ,rules: [{
       required: true,

+ 19 - 4
src/views/base/materials/index.vue

@@ -24,8 +24,16 @@
           :size="size"
           @click="multipleDelete"
           >删除</el-button
-        >
-      </template>
+        ></template>
+        <template #menu="{row,index,type}">
+          <el-button @click="binding(row)"
+                     icon="el-icon-link"
+                     text
+                     type="primary"
+          >BOM</el-button>
+        </template>
+
+
       <template #menu-right="{}">
         <el-dropdown split-button
           >导入
@@ -53,7 +61,7 @@
     <ExcelUpload ref="uploadRef" @finished="uploadFinished" />
   </div>
 </template>
-<script setup>
+<script setup lang="ts">
 import { ref, getCurrentInstance } from "vue";
 import { useCrud } from "@/hooks/userCrud";
 import ButtonPermKeys from "@/common/configs/buttonPermission";
@@ -86,12 +94,17 @@ const { checkBtnPerm, downloadTemplate, exportData } = Utils; //按钮权限等
 // });
 
 const crudRef = ref(null); //crudRef.value 获取avue-crud对象
-
+const router = useRouter();
+const binding = (row) => {
+  router.push(`/base/bom/${row.materialCode}`);
+};
 onMounted(() => {
   // console.log("crudRef", crudRef)
   dataList();
 });
 
+
+
 /**
  * 上传excel相关
  */
@@ -112,4 +125,6 @@ option.value = Object.assign(option.value, {
   selection: true,
   column: columns,
 });
+
+
 </script>

+ 56 - 36
src/views/base/modeling/factory/index.vue

@@ -1,3 +1,5 @@
+
+
 <template>
   <div class="mainContentBox">
     <avue-crud
@@ -26,41 +28,48 @@
         >删除</el-button
         >
       </template>
-      <template #menu-right="{}">
-        <el-dropdown split-button
-        >导入
-          <template #dropdown>
-            <el-dropdown-menu>
-              <el-dropdown-item
-                @click="downloadTemplate('/api/v1/plan/order/template')"
-              >
-                <i-ep-download />下载模板
-              </el-dropdown-item>
-              <el-dropdown-item @click="importExcelData">
-                <i-ep-top />导入数据
-              </el-dropdown-item>
-            </el-dropdown-menu>
-          </template>
-        </el-dropdown>
-        <el-button class="ml-3" @click="exportData">
-          <template #icon> <i-ep-download /> </template>导出
-        </el-button>
+      <template #menu="{row,index,type}">
+        <el-button @click="binding(row)"
+                   icon="el-icon-link"
+                   text
+                   type="primary"
+                   >绑定子项</el-button>
       </template>
+
     </avue-crud>
+
+      <CommonTable
+        ref="ctableRef"
+        tableTitle="绑定子项"
+        tableType="FACTORY"
+        @selected-sure="onSelectedFinish"
+      />
+
     <ExcelUpload ref="uploadRef" @finished="uploadFinished" />
   </div>
 </template>
-<script setup>
+<script setup lang="ts">
   import { ref, getCurrentInstance } from "vue";
   import { useCrud } from "@/hooks/userCrud";
   import ButtonPermKeys from "@/common/configs/buttonPermission";
   import { useCommonStoreHook } from "@/store";
   const { isShowTable, tableType } = toRefs(useCommonStoreHook());
-
-  const test = () => {
-    isShowTable.value = true;
-    tableType.value = tableType.value == 1 ? 2 : 1;
+  import {
+    updateWorkShop,
+  } from "@/api/workShop";
+  // 公共弹窗相关
+  const ctableRef = ref(null);
+  const factory=ref({});
+  const binding = (row) => {
+    factory.value=row;
+    if (ctableRef.value) {
+      ctableRef.value.startSelect();
+    }
   };
+  const dialog = reactive({
+    title: "绑定子项",
+    visible: false,
+  });
 
   // 传入一个url,后面不带/
   const { form, data, option, search, page, toDeleteIds, Methords, Utils } =
@@ -100,23 +109,19 @@
       uploadRef.value.show("/api/v1/plan/order/import");
     }
   };
-
+  const formData=ref({});
   // 设置表格列或者其他自定义的option
   option.value = Object.assign(option.value, {
     selection: true,
     menuWidth: 320,
+    border: true,
+    index: true,
+    rowKey: 'id',
+    rowParentKey: 'parentId',
     column: [
-      // 添加一个自增列
-      {
-        label: "id",
-        prop: "id",
-        hide:true,
-        display:false
-
-      },
       {
         label: "厂区名称",
-        prop: "factoryName",
+        prop: "name",
         search: true,
         span: 24,
         labelWidth: 100,
@@ -128,7 +133,7 @@
       },
       {
         label: "厂区负责人",
-        prop: "factoryManager",
+        prop: "manager",
         span: 24,
         labelWidth: 100,
         rules: [{
@@ -146,7 +151,7 @@
       },
       {
         label: "厂区位置",
-        prop: "factoryPosition",
+        prop: "position",
         span: 24,
         labelWidth: 100,
         rules: [{
@@ -169,6 +174,21 @@
       },
     ],
   });
+
+
+  const onSelectedFinish = (selectedValue) => {
+    formData.id=selectedValue.id;
+    formData.parentId=factory.value.id;
+    updateWorkShop(formData).then((data: any) => {
+      ElMessage({
+        message: data.msg,
+        type: "success",
+      });
+      // 上传完成后的刷新操作
+      page.currentPage = 1;
+      dataList();
+    });
+  };
 </script>
 
 

+ 11 - 23
src/views/base/modeling/production-line/index.vue

@@ -26,28 +26,14 @@
         >删除</el-button
         >
       </template>
-      <template #menu-right="{}">
-        <el-dropdown split-button
-        >导入
-          <template #dropdown>
-            <el-dropdown-menu>
-              <el-dropdown-item
-                @click="downloadTemplate('/api/v1/plan/order/template')"
-              >
-                <i-ep-download />下载模板
-              </el-dropdown-item>
-              <el-dropdown-item @click="importExcelData">
-                <i-ep-top />导入数据
-              </el-dropdown-item>
-            </el-dropdown-menu>
-          </template>
-        </el-dropdown>
-        <el-button class="ml-3" @click="exportData">
-          <template #icon> <i-ep-download /> </template>导出
-        </el-button>
+      <template #menu="{row,index,type}">
+        <el-button @click="binding(row)"
+                   icon="el-icon-link"
+                   text
+                   type="primary"
+        >产能</el-button>
       </template>
     </avue-crud>
-    <ExcelUpload ref="uploadRef" @finished="uploadFinished" />
   </div>
 </template>
 <script setup>
@@ -100,14 +86,16 @@
       uploadRef.value.show("/api/v1/plan/order/import");
     }
   };
+  const binding=(row)=>{
 
+  }
   // 设置表格列或者其他自定义的option
   option.value = Object.assign(option.value, {
     selection: true,
     column: [
       {
         label: "产线名称",
-        prop: "productionLineName",
+        prop: "name",
         search: true,
         rules: [{
           required: true,
@@ -117,7 +105,7 @@
       },
       {
         label: "产线负责人",
-        prop: "productionLineManager",
+        prop: "manager",
         rules: [{
           required: true,
           message: "请选择产线负责人",
@@ -133,7 +121,7 @@
       },
       {
         label: "产线位置",
-        prop: "productionLinePosition",
+        prop: "position",
       },
       {
         label: "所属车间",

+ 115 - 0
src/views/base/modeling/station/columns.ts

@@ -0,0 +1,115 @@
+import { useDictionaryStoreHook } from "@/store";
+const { dicts } = useDictionaryStoreHook();
+export const columns = [
+  {
+    label: "工位编号",
+    prop: "stationCode",
+    search: true,
+    rules: [{
+      required: true,
+      message: "请填写工位编号",
+      trigger: "blur"
+    }],
+  },
+  {
+    label: "工位名称",
+    prop: "name",
+    search: true,
+    rules: [{
+      required: true,
+      message: "请填写工位名称",
+      trigger: "blur"
+    }],
+  },
+  {
+    label: "工位类型",
+    prop: "stationDictValue",
+    search: true,
+    rules: [{
+      required: true,
+      message: "请选择工位类型",
+      trigger: "blur"
+    }],
+    type: 'select',
+    dicData:dicts.station_type,
+    searchClearable: false, //可清空的输入框,默认为true
+    filterable: true, //添加filterable属性即可启用搜索功能
+    props: {
+      label: "dictLabel", // 下拉菜单显示的字段
+      value: "dictValue" // 下拉菜单值的字段
+    },
+  },
+  {
+    label: "工位操作方式",
+    prop: "operateDictValue",
+    rules: [{
+      required: true,
+      message: "请选择工位方式",
+      trigger: "blur"
+    }],
+    type: 'select',
+    dicData:dicts.station_operate_type,
+    props: {
+      label: "dictLabel", // 下拉菜单显示的字段
+      value: "dictValue" // 下拉菜单值的字
+    },
+  },
+  {
+    label: "工位负责人",
+    prop: "manager",
+    rules: [{
+      required: true,
+      message: "请选择工位负责人",
+      trigger: "blur"
+    }],
+    type: 'select',
+    dicUrl:import.meta.env.VITE_APP_BASE_API+"/api/v1/sys/user/list",
+    dicMethod:"post",
+    props: {
+      label: "userName", // 下拉菜单显示的字段
+      value: "userName" // 下拉菜单值的字段
+    },
+  },
+  {
+    label: "所属产线",
+    prop: "productionLineName",
+    display:false
+  },
+  {
+    label: "工位地址",
+    prop: "position",
+    rules: [{
+      required: true,
+      message: "请填写工位地址",
+      trigger: "blur"
+    }],
+  },
+  {
+    label: "工位IP地址",
+    prop: "stationIp",
+    rules: [{
+      required: true,
+      message: "请填写工位IP地址",
+      trigger: "blur",
+    }],
+
+  },
+  {
+    label: "工位描述",
+    prop: "remark",
+    type: 'textarea',
+    span: 24,
+  },
+  {
+    label: "创建人",
+    prop: "creator",
+    display:false
+  },
+  {
+    label: "创建时间",
+    prop: "created",
+    display:false
+  },
+]
+
+

+ 20 - 114
src/views/base/modeling/station/index.vue

@@ -7,7 +7,7 @@
       :data="data"
       :option="option"
       v-model:page="page"
-      @row-save="createRow"
+      @row-save="rowSave"
       @row-update="updateRow"
       @row-del="deleteRow"
       @search-change="searchChange"
@@ -16,19 +16,30 @@
       @current-change="dataList"
       @selection-change="selectionChange"
     >
+      <template #menu-left="{ size }">
+        <el-button
+          :disabled="toDeleteIds.length < 1"
+          type="danger"
+          icon="el-icon-delete"
+          :size="size"
+          @click="multipleDelete"
+        >删除</el-button
+        >
+      </template>
 
     </avue-crud>
 
   </div>
 </template>
-<script setup>
+<script setup="ts">
   import { ref, getCurrentInstance } from "vue";
   import { useCrud } from "@/hooks/userCrud";
-  import dictDataUtil from "@/common/configs/dictDataUtil";
   import ButtonPermKeys from "@/common/configs/buttonPermission";
   import { useCommonStoreHook } from "@/store";
-  const { isShowTable, tableType } = toRefs(useCommonStoreHook());
 
+  const { isShowTable, tableType } = toRefs(useCommonStoreHook());
+  import { useDictionaryStoreHook } from "@/store";
+  import { columns } from "./columns";
   const test = () => {
     isShowTable.value = true;
     tableType.value = tableType.value == 1 ? 2 : 1;
@@ -50,7 +61,11 @@
   //   editBtn: checkPerm(buttonPermission.PLAN.BTNS.order_edit),
   //   menu: true,
   // });
+  function rowSave(form,done,loading) {
+    console.info(form);
+    createRow(form,done,loading);
 
+  }
   const crudRef = ref(null); //crudRef.value 获取avue-crud对象
 
   onMounted(() => {
@@ -76,116 +91,7 @@
   // 设置表格列或者其他自定义的option
   option.value = Object.assign(option.value, {
     selection: true,
-    column: [
-      {
-        label: "工位编号",
-        prop: "stationCode",
-        search: true,
-        rules: [{
-          required: true,
-          message: "请填写工位编号",
-          trigger: "blur"
-        }],
-      },
-      {
-        label: "工位名称",
-        prop: "stationName",
-        search: true,
-        rules: [{
-          required: true,
-          message: "请填写工位名称",
-          trigger: "blur"
-        }],
-      },
-      {
-        label: "工位类型",
-        prop: "stationDictValue",
-        search: true,
-        rules: [{
-          required: true,
-          message: "请选择工位类型",
-          trigger: "blur"
-        }],
-        type: 'select',
-        dicUrl:dictDataUtil.request_url+dictDataUtil.TYPE_CODE.station_type,
-        searchClearable: false, //可清空的输入框,默认为true
-        filterable: true, //添加filterable属性即可启用搜索功能
-        props: {
-          label: "dictLabel", // 下拉菜单显示的字段
-          value: "dictValue" // 下拉菜单值的字段
-        },
-      },
-      {
-        label: "工位操作方式",
-        prop: "operateDictValue",
-        rules: [{
-          required: true,
-          message: "请选择工位方式",
-          trigger: "blur"
-        }],
-        type: 'select',
-        dicUrl:dictDataUtil.request_url+dictDataUtil.TYPE_CODE.station_operate_type,
-        props: {
-          label: "dictLabel", // 下拉菜单显示的字段
-          value: "dictValue" // 下拉菜单值的字
-        },
-      },
-      {
-        label: "工位负责人",
-        prop: "stationManager",
-        rules: [{
-          required: true,
-          message: "请选择工位负责人",
-          trigger: "blur"
-        }],
-        type: 'select',
-        dicUrl:import.meta.env.VITE_APP_BASE_API+"/api/v1/sys/user/list",
-        dicMethod:"post",
-        props: {
-          label: "userName", // 下拉菜单显示的字段
-          value: "userName" // 下拉菜单值的字段
-        },
-      },
-      {
-        label: "所属产线",
-        prop: "productionLineName",
-        display:false
-      },
-      {
-        label: "工位地址",
-        prop: "stationPosition",
-        rules: [{
-          required: true,
-          message: "请填写工位地址",
-          trigger: "blur"
-        }],
-      },
-      {
-        label: "工位IP地址",
-        prop: "stationIp",
-        rules: [{
-          required: true,
-          message: "请填写工位IP地址",
-          trigger: "blur"
-        }],
-      },
-      {
-        label: "工位描述",
-        prop: "remark",
-        type: 'textarea',
-        span: 24,
-      },
-      {
-        label: "创建人",
-        prop: "creator",
-        display:false
-      },
-      {
-        label: "创建时间",
-        prop: "created",
-        display:false
-      },
-    ],
+    column: columns,
   });
 </script>
 

+ 5 - 24
src/views/base/modeling/work-shop/index.vue

@@ -26,28 +26,9 @@
         >删除</el-button
         >
       </template>
-      <template #menu-right="{}">
-        <el-dropdown split-button
-        >导入
-          <template #dropdown>
-            <el-dropdown-menu>
-              <el-dropdown-item
-                @click="downloadTemplate('/api/v1/plan/order/template')"
-              >
-                <i-ep-download />下载模板
-              </el-dropdown-item>
-              <el-dropdown-item @click="importExcelData">
-                <i-ep-top />导入数据
-              </el-dropdown-item>
-            </el-dropdown-menu>
-          </template>
-        </el-dropdown>
-        <el-button class="ml-3" @click="exportData">
-          <template #icon> <i-ep-download /> </template>导出
-        </el-button>
-      </template>
+
     </avue-crud>
-    <ExcelUpload ref="uploadRef" @finished="uploadFinished" />
+
   </div>
 </template>
 <script setup>
@@ -107,12 +88,12 @@
     column: [
       {
         label: "车间名称",
-        prop: "workShopName",
+        prop: "name",
         search: true,
       },
       {
         label: "车间负责人",
-        prop: "workShopManager",
+        prop: "manager",
         rules: [{
           required: true,
           message: "请选择厂区负责人",
@@ -128,7 +109,7 @@
       },
       {
         label: "车间位置",
-        prop: "workShopPosition",
+        prop: "position",
       },
       {
         label: "所属工厂",