lupeng 1 tahun lalu
induk
melakukan
a6953c3325

+ 3 - 3
src/api/bom/index.ts

@@ -3,14 +3,14 @@ import { AxiosPromise } from "axios";
 import { BomInfo} from "./types";
 
 /**
- * 修改用户
+ * 批量新增BOM单
  *
  * @param id
  * @param data
  */
-export function getList(data: BomInfo) {
+export function batchAddBom(data: any) {
   return request({
-    url: "/api/v1/base/materialBom/list",
+    url: "/api/v1/base/materialBom/batchAdd",
     method: "post",
     data: data,
   });

+ 15 - 0
src/api/material/index.ts

@@ -0,0 +1,15 @@
+import request from "@/utils/request";
+import { AxiosPromise } from "axios";
+
+/**
+ * 获取物料信息
+ *
+ * @param id
+ * @param data
+ */
+export function getMaterialDetails(materialCode: String): AxiosPromise<any> {
+  return request({
+    url: "/api/v1/base/material/getDetails/" + materialCode,
+    method: "get",
+  });
+}

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

@@ -0,0 +1,17 @@
+import request from "@/utils/request";
+import { AxiosPromise } from "axios";
+import { ProductionLineInfo} from "./types";
+
+/**
+ * 修改产线
+ *
+ * @param id
+ * @param data
+ */
+export function updateProductionLine(data: ProductionLineInfo) {
+  return request({
+    url: "/api/v1/base/productionLine/update",
+    method: "post",
+    data: data,
+  });
+}

+ 5 - 0
src/api/productionLine/types.ts

@@ -0,0 +1,5 @@
+export interface ProductionLineInfo {
+  id?:number;
+  code?: string;
+  parentCode?: string;
+}

+ 31 - 0
src/api/station/index.ts

@@ -0,0 +1,31 @@
+import request from "@/utils/request";
+import { AxiosPromise } from "axios";
+import {Station, StationDevice} from "./types";
+
+/**
+ * 修改工位
+ *
+ * @param id
+ * @param data
+ */
+export function updateStation(data: Station) {
+  return request({
+    url: "/api/v1/base/station/update",
+    method: "post",
+    data: data,
+  });
+}
+
+/**
+ * 工位绑定设备
+ *
+ * @param id
+ * @param data
+ */
+export function addStationDevice(data: StationDevice) {
+  return request({
+    url: "/api/v1/base/stationDevice/add",
+    method: "post",
+    data: data,
+  });
+}

+ 27 - 0
src/api/station/types.ts

@@ -0,0 +1,27 @@
+/**
+ *
+ * 工位绑定产线参数
+ *
+ */
+
+export interface Station {
+  id?:number;
+  //工位编码
+  code?: string;
+  //上级产线编码
+  parentCode?: string;
+}
+
+
+/**
+ *
+ * 工位绑定设备参数
+ *
+ */
+
+export interface StationDevice {
+  //工位id
+  stationId?: number;
+  //设备编号
+  deviceNo?: string;
+}

+ 2 - 2
src/api/workShop/index.ts

@@ -3,14 +3,14 @@ import { AxiosPromise } from "axios";
 import { WorkShopInfo} from "./types";
 
 /**
- * 修改用户
+ * 修改车间
  *
  * @param id
  * @param data
  */
 export function updateWorkShop(data: WorkShopInfo) {
   return request({
-    url: "/api/v1/base/materialBom/list",
+    url: "/api/v1/base/workShop/update",
     method: "post",
     data: data,
   });

+ 3 - 2
src/api/workShop/types.ts

@@ -1,4 +1,5 @@
 export interface WorkShopInfo {
-  id?: number;
-  parentId?: number;
+  id?:number;
+  code?: string;
+  parentCode?: string;
 }

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

@@ -176,4 +176,240 @@ export const tableConfig = {
   },
 
 
+  PRODUCTIONLINE: {
+    url: "/api/v1/base/productionLine",
+    column: [
+      {
+        label: "产线名称",
+        prop: "name",
+        search: true,
+        rules: [{
+          required: true,
+          message: "请填写产线名称",
+          trigger: "blur"
+        }],
+      },
+      {
+        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: "workShopName",
+        display:false
+      },
+      {
+        label: "产线描述",
+        prop: "remark",
+      },
+      {
+        label: "创建人",
+        prop: "creator",
+        display:false
+      },
+      {
+        label: "创建时间",
+        prop: "created",
+        display:false
+      },
+    ],
+  },
+
+  STATION: {
+    url: "/api/v1/base/station",
+    column: [
+      {
+        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
+      },
+    ],
+  },
+
+
+  DEVICE: {
+    url: "/api/v1/device",
+    column: [
+      {
+        label: "设备编号",
+        prop: "deviceNo",
+        search: true,
+        width: '120',
+        rules: [
+          {
+            required: true,
+            message: "设备编号不能为空",
+            trigger: "trigger",
+          },
+        ],
+      },
+      {
+        label: "设备名称",
+        prop: "deviceName",
+        search: true,
+        width: '120',
+        rules: [
+          {
+            required: true,
+            message: "设备名称不能为空",
+            trigger: "trigger",
+          },
+        ],
+      },
+      {
+        label: "设备类型",
+        prop: "deviceType",
+        type: "select",
+        search: true,
+        width: '100',
+        dicData:
+          dicts.device_type,
+        props: {
+          label: "dictLabel",
+          value: "dictValue",
+        },
+      },
+      {
+        label: "负责人",
+        width: '100',
+        prop: "head",
+      },
+      {
+        label: "设备位置",
+        width: '150',
+        prop: "devicePosition",
+      },
+      {
+        label: "规格",
+        width: '150',
+        prop: "specifications",
+      },
+      {
+        label: "品牌",
+        width: '150',
+        prop: "brand",
+      },
+    ],
+  },
+
 };

+ 6 - 2
src/components/CommonTable/index.vue

@@ -16,6 +16,10 @@
       @row-save="createRow"
       @row-update="updateRow"
       @row-del="deleteRow"
+      @search-change="searchChange"
+      @search-reset="resetChange"
+      @size-change="dataList"
+      @current-change="dataList"
       @selection-change="selectionChange"
     />
 
@@ -50,11 +54,11 @@ const startSelect = () => {
 };
 
 // 传入一个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,
   });
-const { dataList, createRow, updateRow, deleteRow } = Methords; //增删改查
+const { dataList, createRow, updateRow, deleteRow , searchChange, resetChange} = Methords; //增删改查
 const { selectionChange, multipleDelete } = Methords; //选中和批量删除事件
 
 const crudRef = ref(null); //crudRef.value 获取avue-crud对象

+ 24 - 1
src/hooks/userCrud.ts

@@ -116,7 +116,30 @@ export const useCrud = (config?: UseCrudConfig) => {
         config?.done && config?.done();
       }
     },
-
+    dataNoPageList: async (config?: UseCrudConfig) => {
+      handleSearchData();
+      try {
+        const res = await request({
+          url: `${url.value}/list`,
+          method: "post",
+          data: {
+            ...search.value,
+          },
+        });
+        if (res?.data) {
+          data.value = res?.data || [];
+        }
+        for (let i = 0; i < data.value.length; i++) {
+          data.value[i].$cellEdit=true;
+        }
+        console.info(data);
+        config?.done && config?.done();
+      } catch (err) {
+        config?.loading && config?.loading();
+      } finally {
+        config?.done && config?.done();
+      }
+    },
     createRow: (row: any, done: () => void, loading: () => void) => {
       save({ row: row, done: done, loading: loading });
     },

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

@@ -16,6 +16,7 @@ export const useDictionaryStore = defineStore("dictionaryStore", {
       "packaging_method",
       "quality_grade",
       "selection_type",
+      "device_type",
       "stage",
       "danwei_type",
       "process_type",

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

@@ -25,10 +25,18 @@ export const columns = [
   {
     label: "物料属性",
     prop: "bomMaterialAttribute",
+    type: 'select',
+    dicData:dicts.material_properties,
+    props: { label: "dictLabel", value: "dictValue" },
   },
   {
     label: "物料数量",
     prop: "bomMaterialNumber",
+    min:0,
+    slot:true,
+    cell: true,
+    type: "number",
+    precision: 2,
   },
 
 

+ 132 - 57
src/views/base/bom/index.vue

@@ -1,41 +1,45 @@
 <template>
   <div class="mainContentBox">
+    <!--{{dataDetail}}-->
+    <!--{{dicts}}-->
+    <div class="detail">
+      <div class="title-detail">物料名称:{{dataDetail.materialCode}}</div>
+      <div class="title-detail">物料编码:{{dataDetail.materialName}}</div>
+      <div class="title-detail">物料属性:{{dataDetail.attributeDictLabel}}</div>
+    </div>
     <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"
+          type="primary"
           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="绑定子项"
+          tableTitle="物料选择"
           tableType="BOM"
           @selected-sure="onSelectedFinish"
         />
+      <template #footer>
+        <div class="detail-footer">
+          <el-button type="primary" @click="onSelected"> 保存 </el-button>
+          <el-button @click="routeBack">取消</el-button>
 
+        </div>
+      </template>
       <template #menu-right="{}">
         <el-dropdown split-button
           >导入
@@ -52,17 +56,11 @@
             </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="绑定子项"
+      tableTitle="BOM添加"
       tableType="MARTERIAL"
       @selected-sure="onSelectedFinish"
     />
@@ -78,30 +76,33 @@ import { useCommonStoreHook, useDictionaryStoreHook } from "../../../store/index
 import {
   getList,
 } from "@/api/bom";
+import {
+  getMaterialDetails,
+} from "@/api/material";
+
+import {
+  batchAddBom,
+} from "@/api/bom";
 const { isShowTable, tableType } = toRefs(useCommonStoreHook());
 // 数据字典相关
 const { dicts } = useDictionaryStoreHook();
 const router = useRouter();
 const route = useRoute();
+
+const dataDetail=ref({});
 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",
-    });
-  });
+const dataBomLists=()=>{
+  search.value.materialCode=route.value.materialCode;
+  dataNoPageList();
 }
 
 const ctableRef = ref(null);
@@ -111,16 +112,47 @@ const binding = (row) => {
     ctableRef.value.startSelect();
   }
 };
-const dialog = reactive({
-  title: "绑定子项",
-  visible: false,
-});
+const onSelected=()=>{
+  for(var i=0;i<data.value.length;i++){
+    if(data.value[i].bomMaterialNumber<=0){
+      ElMessage({
+        message: data.value[i].bomMaterialName+"数量不能为0",
+        type: "error",
+      });
+      return;
+    }
+  }
+  if(data.value.length===0){
+    ElMessage({
+      message: "物料记录不能为空!",
+      type: "error",
+    });
+    return;
+  }
+  batchAddBom(data.value).then(
+    (data: any)=>{
+      if(data.code==="200") {
+        ElMessage({
+          message: data.msg,
+          type: "success",
+        });
+        router.back();
+      }
+      else {
+        ElMessage({
+          message: data.msg,
+          type: "error",
+        });
+      }
+    }
+  );
+}
 // 传入一个url,后面不带/
 const { form, data, option, search, page, toDeleteIds, Methords, Utils } =
   useCrud({
     src: "/api/v1/base/materialBom",
   });
-const { dataList, createRow, updateRow, deleteRow, searchChange, resetChange } =
+const { dataNoPageList,createRow, updateRow, deleteRow, searchChange, resetChange } =
   Methords; //增删改查
 const { selectionChange, multipleDelete } = Methords; //选中和批量删除事件
 const { checkBtnPerm, downloadTemplate, exportData } = Utils; //按钮权限等工具
@@ -136,16 +168,10 @@ 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();
-  });
+  search.value.materialCode=route.params.materialCode;
+  queryMaterialDetail();
+  dataNoPageList();
+
 });
 
 /**
@@ -154,8 +180,7 @@ onMounted(() => {
 const uploadRef = ref(null);
 const uploadFinished = () => {
   // 上传完成后的刷新操作
-  page.currentPage = 1;
-  dataList();
+  dataNoPageList();
 };
 const importExcelData = () => {
   if (uploadRef.value) {
@@ -166,20 +191,70 @@ const importExcelData = () => {
 // 设置表格列或者其他自定义的option
 option.value = Object.assign(option.value, {
   selection: true,
+  addBtn: false,
+  viewBtn: false,
+  editBtn:false,
+  saveBtn:false,
+  cellBtn: true,
   column: columns,
 });
-
+const routeBack =()=>{
+  router.back();
+}
 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();
-  });*/
+  for(var i=0;i<data.value.length;i++){
+    if(data.value[i].bomMaterialCode===selectedValue.materialCode){
+      ElMessage({
+        message: data.value[i].bomMaterialName+"已经添加过了",
+        type: "error",
+      });
+      return;
+    }
+  }
+  const bom=ref({
+    materialCode:route.params.materialCode,
+    bomMaterialCode:selectedValue.materialCode,
+    bomMaterialName:selectedValue.materialName,
+    bomMaterialAttribute:selectedValue.attributeDictValue,
+    bomMaterialNumber:0,
+    $cellEdit:true,
+  });
+  data.value.push(bom.value);
+};
+const queryMaterialDetail = () => {
+  getMaterialDetails(route.params.materialCode).then(
+
+    ({ data }) => {
+      dataDetail.value=data;
+      dicts.material_properties;
+      for(var i=0;i<dicts.material_properties.length;i++){
+        if(data.attributeDictValue===dicts.material_properties[i].dictValue){
+          dataDetail.value.attributeDictLabel=dicts.material_properties[i].dictLabel;
+        }
+      }
+
+    }
+  );
 };
 </script>
+<style type="text/css">
+  .title-detail{
+    width: 30%;
+    height: 50px;
+    line-height: 50px;
+    margin: 25px 20px 25px 0;
+    float: left;
+  }
+  .detail{
+    margin: 0 auto;
+    width: 100%;
+  }
+  .avue-crud{
+    float: left;
+  }
+  .detail-footer{
+    float: right;
+    margin-top:15px;
+  }
+
+</style>

+ 61 - 6
src/views/base/modeling/factory/index.vue

@@ -1,5 +1,3 @@
-
-
 <template>
   <div class="mainContentBox">
     <avue-crud
@@ -44,6 +42,18 @@
         tableType="FACTORY"
         @selected-sure="onSelectedFinish"
       />
+    <CommonTable
+      ref="workShopRef"
+      tableTitle="绑定子项"
+      tableType="PRODUCTIONLINE"
+      @selected-sure="onSelectedLineFinish"
+    />
+    <CommonTable
+      ref="productionLineRef"
+      tableTitle="绑定子项"
+      tableType="STATION"
+      @selected-sure="onSelectedStationFinish"
+    />
 
     <ExcelUpload ref="uploadRef" @finished="uploadFinished" />
   </div>
@@ -57,14 +67,30 @@
   import {
     updateWorkShop,
   } from "@/api/workShop";
+
+  import {
+    updateProductionLine,
+  } from "@/api/productionLine";
+  import {
+    updateStation,
+  } from "@/api/station";
   // 公共弹窗相关
   const ctableRef = ref(null);
+  const workShopRef=ref(null);
+  const productionLineRef=ref(null);
   const factory=ref({});
   const binding = (row) => {
     factory.value=row;
-    if (ctableRef.value) {
+    if (row.level==="first") {
       ctableRef.value.startSelect();
     }
+    if(row.level==="second"){
+      workShopRef.value.startSelect();
+    }
+    if(row.level==="third"){
+      productionLineRef.value.startSelect();
+    }
+
   };
   const dialog = reactive({
     title: "绑定子项",
@@ -116,8 +142,8 @@
     menuWidth: 320,
     border: true,
     index: true,
-    rowKey: 'id',
-    rowParentKey: 'parentId',
+    rowKey: 'code',
+    rowParentKey: 'parentCode',
     column: [
       {
         label: "厂区名称",
@@ -177,8 +203,9 @@
 
 
   const onSelectedFinish = (selectedValue) => {
+    formData.code=selectedValue.code;
+    formData.parentCode=factory.value.code;
     formData.id=selectedValue.id;
-    formData.parentId=factory.value.id;
     updateWorkShop(formData).then((data: any) => {
       ElMessage({
         message: data.msg,
@@ -189,6 +216,34 @@
       dataList();
     });
   };
+  const onSelectedLineFinish = (selectedValue) => {
+    formData.code=selectedValue.code;
+    formData.parentCode=factory.value.code;
+    formData.id=selectedValue.id;
+    updateProductionLine(formData).then((data: any) => {
+      ElMessage({
+        message: data.msg,
+        type: "success",
+      });
+      // 上传完成后的刷新操作
+      page.currentPage = 1;
+      dataList();
+    });
+  };
+  const onSelectedStationFinish = (selectedValue) => {
+    formData.code=selectedValue.code;
+    formData.parentCode=factory.value.code;
+    formData.id=selectedValue.id;
+    updateStation(formData).then((data: any) => {
+      ElMessage({
+        message: data.msg,
+        type: "success",
+      });
+      // 上传完成后的刷新操作
+      page.currentPage = 1;
+      dataList();
+    });
+  };
 </script>
 
 

+ 115 - 0
src/views/base/modeling/production-line/capacity/columns.ts

@@ -0,0 +1,115 @@
+import { useDictionaryStoreHook } from "@/store";
+const { dicts } = useDictionaryStoreHook();
+export const columns = [
+  {
+    label: "物料编号",
+    prop: "materialCode",
+    search: true,
+    rules: [{
+      required: true,
+      message: "请选择物料编号",
+      trigger: "blur"
+    }],
+  },
+  {
+    label: "产能",
+    prop: "capacity",
+    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
+  },
+]
+
+

+ 6 - 0
src/views/base/modeling/production-line/capacity/index.vue

@@ -0,0 +1,6 @@
+<template>
+  <avue-form ref="formRef"
+             :option="option"
+             v-model="form"
+             @submit="handleSubmit"></avue-form>
+</template>

+ 1 - 1
src/views/base/modeling/station/columns.ts

@@ -3,7 +3,7 @@ const { dicts } = useDictionaryStoreHook();
 export const columns = [
   {
     label: "工位编号",
-    prop: "stationCode",
+    prop: "code",
     search: true,
     rules: [{
       required: true,

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

@@ -0,0 +1,39 @@
+import { useDictionaryStoreHook } from "@/store";
+const { dicts } = useDictionaryStoreHook();
+export const columns = [
+  {
+    label: "设备编号",
+    prop: "deviceNo",
+    search: true,
+    rules: [{
+      required: true,
+      message: "请填写工位编号",
+      trigger: "blur"
+    }],
+  },
+  {
+    label: "设备名称",
+    prop: "deviceName",
+    search: true,
+  },
+  {
+    label: "设备类型",
+    prop: "device_type",
+    search: true,
+    rules: [{
+      required: true,
+      message: "请选择工位类型",
+      trigger: "blur"
+    }],
+    type: 'select',
+    dicData:dicts.device_type,
+    searchClearable: false, //可清空的输入框,默认为true
+    filterable: true, //添加filterable属性即可启用搜索功能
+    props: {
+      label: "dictLabel", // 下拉菜单显示的字段
+      value: "dictValue" // 下拉菜单值的字段
+    },
+  },
+]
+
+

+ 162 - 0
src/views/base/modeling/station/components/station-page.vue

@@ -0,0 +1,162 @@
+<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="deviceList"
+      @row-update="updateRow"
+      @row-del="deleteRow"
+      @search-change="searchChange"
+      @search-reset="resetChange"
+      @size-change="dataList"
+      @current-change="dataList"
+      @selection-change="selectionChange"
+    >
+      <template #menu-left="{ size }">
+        <el-button
+          type="primary"
+          icon="el-icon-plus"
+          @click="deviceList"
+        >新增</el-button
+        >
+        <el-button
+          :disabled="toDeleteIds.length < 1"
+          type="danger"
+          icon="el-icon-delete"
+          :size="size"
+          @click="multipleDelete"
+        >删除</el-button
+        >
+      </template>
+    </avue-crud>
+    <CommonTable
+      ref="ctableRef"
+      tableTitle="设备列表"
+      tableType="DEVICE"
+      @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 { useCommonStoreHook } from "@/store";
+
+  const { isShowTable, tableType } = toRefs(useCommonStoreHook());
+  import { useDictionaryStoreHook } from "@/store";
+  import { columns } from "./columns";
+  import {
+    addStationDevice,
+  } from "@/api/station";
+  const test = () => {
+    isShowTable.value = true;
+    tableType.value = tableType.value == 1 ? 2 : 1;
+  };
+
+  // 传入一个url,后面不带/
+  const { form, data, option, search, page, toDeleteIds, Methords, Utils } =
+    useCrud({
+      src: "/api/v1/base/stationDevice",
+    });
+  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,
+  // });
+  function rowSave(form,done,loading) {
+    console.info(form);
+    createRow(form,done,loading);
+
+  }
+  const crudRef = ref(null); //crudRef.value 获取avue-crud对象
+
+  onMounted(() => {
+    // console.log("crudRef", crudRef)
+    dataList();
+  });
+
+  /**
+   * 上传excel相关
+   */
+  const uploadRef = ref(null);
+  const uploadFinished = () => {
+    // 上传完成后的刷新操作
+    page.currentPage = 1;
+    dataList();
+  };
+  const importExcelData = () => {
+    if (uploadRef.value) {
+      uploadRef.value.show("/api/v1/base/stationDevice");
+    }
+  };
+  const ctableRef=ref(null);
+  const deviceList=()=>{
+    ctableRef.value.startSelect();
+  }
+
+  // 设置表格列或者其他自定义的option
+  option.value = Object.assign(option.value, {
+    selection: true,
+    column: columns,
+    saveBtn:false,
+    delBtn: false,
+    editBtn: false,
+    addBtn: false,
+    viewBtn: false,
+    menu: false,
+  });
+  const props = defineProps({
+    stationId: {
+      type: Number,
+      default: () => {
+        return 0;
+      }
+    }
+  })
+
+  watch?.(
+    () => props.stationId,
+    (newVal: string) => {
+      alert(newVal)
+      search.value.stationId = newVal
+      dataList()
+    }
+  );
+  const onSelectedFinish=(selectedValue)=>{
+    const selectDevice=ref({
+      deviceNo: selectedValue.deviceNo,
+      stationId:props.stationId,
+  });
+    console.info(selectDevice);
+    addStationDevice(selectDevice.value).then(
+      (data:any)=>{
+        if(data.code==="200") {
+          ElMessage({
+            message: data.msg,
+            type: "success",
+          });
+          router.back();
+        }
+        else {
+          ElMessage({
+            message: data.msg,
+            type: "error",
+          });
+        }
+      }
+    );
+
+  }
+</script>
+

+ 24 - 3
src/views/base/modeling/station/index.vue

@@ -26,9 +26,22 @@
         >删除</el-button
         >
       </template>
-
+      <template #menu="{row,index,type}">
+        <el-button @click="binding(row)"
+                   icon="el-icon-link"
+                   text
+                   type="primary"
+        >设备</el-button>
+      </template>
     </avue-crud>
-
+    <el-dialog
+      v-model="dialog.visible"
+      :title="dialog.title"
+      width="900px"
+      @close="dialog.visible = false"
+    >
+      <station-page  :stationId="stationDevice.id"/>
+    </el-dialog>
   </div>
 </template>
 <script setup="ts">
@@ -87,7 +100,15 @@
       uploadRef.value.show("/api/v1/base/station");
     }
   };
-
+  const dialog = reactive({
+    title: "设备绑定",
+    visible: false,
+  });
+  const stationDevice=ref(null);
+  const binding=(row)=>{
+    dialog.visible=true;
+    stationDevice.value=row;
+  }
   // 设置表格列或者其他自定义的option
   option.value = Object.assign(option.value, {
     selection: true,