qinhb před 1 rokem
rodič
revize
0fb8c9efbe

+ 2 - 0
src/common/configs/dictDataUtil.ts

@@ -9,6 +9,8 @@ const DictDataUtil = {
     plan_order_type: "plan_order_type",
     //订单优先级
     plan_order_priority: "plan_order_priority",
+    //工单状态
+    plan_work_order_state: "plan_work_order_state",
     //订单状态
     plan_order_state: "plan_order_state",
     //设备类型

+ 47 - 0
src/common/configs/dictDataUtil.ts~

@@ -0,0 +1,47 @@
+// 所有的字典类型typeCode都要在这里面写。
+
+const DictDataUtil = {
+  request_url:
+    import.meta.env.VITE_APP_BASE_API + "/api/v1/sys/dictData/queryByType/",
+  dept_tree_url: import.meta.env.VITE_APP_BASE_API + "/api/v1/sys/dept/orgTree",
+  TYPE_CODE: {
+    //订单类型
+    plan_order_type: "plan_order_type",
+    //订单优先级
+    plan_order_priority: "plan_order_priority",
+    //订单状态
+    plan_order_state: "plan_order_state",
+    //设备类型
+    device_type: "device_type",
+    //设备状态
+    device_status: "device_status",
+    //设备运行状态
+    device_run_status: "device_run_status",
+    //设备维护频率
+    device_maintenance_cycle: "device_maintenance_cycle",
+    // 工艺路线类型
+    routing_type: "routing_type",
+    //封装方法
+    packaging_method: "packaging_method",
+    //岗位组
+    post_group: "post_group",
+    //岗位类别
+    post_type: "post_type",
+    //仓库类型
+    warehouse_type: "warehouse_type",
+    //货位类型
+    storage_location_type: "storage_location_type"
+  },
+  EXPAND_FIELD_TABLE: {
+    //字段类型
+    expand_field_type: "expand_field_type",
+    //映射表列表
+    expand_table_list: "expand_field_table",
+    //订单计划表
+    plan_order_info: "plan_order_info",
+    //映射字段列表
+    expand_field_list: "expand_field_list",
+  },
+};
+
+export default DictDataUtil;

+ 0 - 1
src/views/device/maintenance/components/record-page.vue

@@ -48,7 +48,6 @@ const props = defineProps({
 watch?.(
     () => props.maintenanceId,
     (newVal: string) => {
-      alert(newVal)
       search.value.maintenanceId = newVal
       dataList()
     }

+ 224 - 0
src/views/plan/order/components/order-page.vue

@@ -0,0 +1,224 @@
+<template>
+  <div class="mainContentBox">
+    <avue-crud
+        ref="crudRef"
+        v-model:search="search"
+        v-model="form"
+        :data="data"
+        :option="option"
+        v-model:page="page"
+        @row-click="rowClick"
+        @search-change="searchChange"
+        @search-reset="resetChange"
+        @size-change="dataList"
+        @current-change="dataList"
+    >
+    </avue-crud>
+  </div>
+</template>
+<script setup>
+import {defineProps, ref} from "vue";
+import { useCrud } from "@/hooks/userCrud";
+
+import { useCommonStoreHook } from "@/store";
+import dictDataUtil from "@/common/configs/dictDataUtil";
+const { isShowTable, tableType } = toRefs(useCommonStoreHook());
+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/plan/order",
+  });
+const { dataList, createRow, updateRow, deleteRow, searchChange, resetChange } = Methords; //增删改查
+const { selectionChange, multipleDelete } = Methords; //选中和批量删除事件
+const { checkBtnPerm, downloadTemplate } = Utils; //按钮权限等工具
+
+const crudRef = ref(null); //crudRef.value 获取avue-crud对象
+const emit = defineEmits(["orderInfo"])
+const rowClick = (row)=>{
+  emit("orderInfo", row)
+}
+const props = defineProps({
+  queryType: {
+    type: String,
+    default: () => {
+      return "0";
+    }
+  }
+})
+// 设置表格列或者其他自定义的option
+option.value = Object.assign(option.value, {
+  delBtn: false,
+  selection: false,
+  search: false,
+  editBtn: false,
+  addBtn: false,
+  viewBtn: false,
+  menu: false,
+  column: [
+    {
+      label: "订单编号",
+      prop: "orderCode",
+      search: true,
+      width: "125",
+      display: false,
+    },
+    {
+      label: "订单名称",
+      prop: "orderName",
+      search: true,
+      width: "100",
+    },
+    {
+      label: "ERP号",
+      prop: "erpCode",
+      search: true,
+      width: "100",
+    },
+    {
+      label: "产品编码",
+      prop: "materialCode",
+      search: true,
+      width: "100",
+    },
+    {
+      label: "产品名称",
+      prop: "materialName",
+      search: true,
+      width: "100",
+    },
+    {
+      label: "产品规格",
+      width: "100",
+      prop: "materialModel",
+    },
+    {
+      label: "订单状态",
+      prop: "orderState",
+      display: false,
+      width: "100",
+      type: "select", //类型为下拉选择框
+      dicUrl:
+          dictDataUtil.request_url + dictDataUtil.TYPE_CODE.plan_order_state,
+      props: {
+        label: "dictLabel",
+        value: "dictValue",
+      },
+      searchClearable: false, //可清空的输入框,默认为true
+      filterable: true, //添加filterable属性即可启用搜索功能
+    },
+    {
+      label: "订单类型",
+      prop: "orderType",
+      type: "select", //类型为下拉选择框
+      width: "100",
+      dicUrl: dictDataUtil.request_url + dictDataUtil.TYPE_CODE.plan_order_type,
+      props: {
+        label: "dictLabel",
+        value: "dictValue",
+      },
+      searchClearable: false, //可清空的输入框,默认为true
+      filterable: true, //添加filterable属性即可启用搜索功能
+    },
+    {
+      label: "订单数量",
+      prop: "orderNum",
+      type: "number",
+      width: "100",
+      min: 1,
+      max: 99999,
+    },
+    {
+      label: "排产数量",
+      prop: "scheduledNum",
+      width: "100",
+      display: false,
+    },
+    {
+      label: "优先级",
+      prop: "priority",
+      width: "100",
+      type: "select", //类型为下拉选择框
+      dicUrl:
+          dictDataUtil.request_url + dictDataUtil.TYPE_CODE.plan_order_priority,
+      props: {
+        label: "dictLabel",
+        value: "dictValue",
+      },
+      searchClearable: false, //可清空的输入框,默认为true
+      filterable: true, //添加filterable属性即可启用搜索功能
+    },
+    {
+      label: "交付日期",
+      prop: "deliverTime",
+      type: "date",
+      width: "100",
+      format: "YYYY-MM-DD", //前端展示格式
+      valueFormat: "YYYY-MM-DD", //设置后端接收的日期格式
+    },
+    {
+      label: "所属公司",
+      prop: "companyId",
+      width: "100",
+      type: "select", //类型为下拉选择框
+      dicUrl: import.meta.env.VITE_APP_BASE_API + "/api/v1/sys/dept/orgList",
+      props: {
+        label: "deptName",
+        value: "id",
+      },
+    },
+    {
+      label: "项目号",
+      width: "100",
+      prop: "projectCode",
+    },
+    {
+      label: "绑定铭牌",
+      prop: "nameplated",
+      width: "100",
+      type: "radio", //类型为单选框
+      dicData: [
+        {
+          label: "否",
+          value: 0,
+        },
+        {
+          label: "是",
+          value: 1,
+        },
+      ],
+      value: 0,
+    },
+    {
+      label: "备注",
+      prop: "remark",
+      width: "100",
+      minRows: 2, //最小行/最小值
+      type: "textarea", //类型为多行文本域框
+      maxlength: 512, //最大输入长度
+    },
+    {
+      label: "创建时间",
+      prop: "created",
+      width: "140",
+      overHidden: true,
+      type: "datetime",
+      valueFormat: "yyyy-MM-dd HH:mm:ss",
+    },
+    {
+      label: "创建人",
+      prop: "creator",
+      width: 80,
+      overHidden: true,
+    },
+  ],
+});
+
+onMounted(() => {
+  search.value.queryType = props.queryType
+  dataList();
+});
+</script>

+ 2 - 2
src/views/plan/order/index.vue

@@ -145,7 +145,7 @@ option.value = {
       label: "订单编号",
       prop: "orderCode",
       search: true,
-      width: "100",
+      width: "125",
       display: false,
     },
     {
@@ -241,7 +241,7 @@ option.value = {
       prop: "orderNum",
       type: "number",
       width: "100",
-      min: 0,
+      min: 1,
       max: 99999,
       rules: [
         {

+ 231 - 0
src/views/plan/workOrder/components/choice-line-page.vue

@@ -0,0 +1,231 @@
+<template>
+  <div class="mainContentBox">
+    <avue-crud
+        ref="crudRef"
+        v-model:search="search"
+        v-model="form"
+        :data="data"
+        :option="option"
+        v-model:page="page"
+        @row-click="rowClick"
+        @search-change="searchChange"
+        @search-reset="resetChange"
+        @size-change="dataList"
+        @current-change="dataList"
+    >
+    </avue-crud>
+  </div>
+</template>
+<script setup>
+import {defineProps, ref} from "vue";
+import { useCrud } from "@/hooks/userCrud";
+
+import { useCommonStoreHook } from "@/store";
+import dictDataUtil from "@/common/configs/dictDataUtil";
+const { isShowTable, tableType } = toRefs(useCommonStoreHook());
+const test = () => {
+  isShowTable.value = true;
+  tableType.value = tableType.value == 1 ? 2 : 1;
+};
+
+const props = defineProps({
+  workShopId: {
+    type: String,
+    default: () => {
+      return '';
+    }
+  },
+  materialCode: {
+    type: String,
+    default: () => {
+      return '';
+    }
+  }
+})
+// 传入一个url,后面不带/
+const { form, data, option, search, page, toDeleteIds, Methords, Utils } =
+  useCrud({
+    src: "/api/v1/plan/order",
+  });
+const { dataList, createRow, updateRow, deleteRow, searchChange, resetChange } = Methords; //增删改查
+const { selectionChange, multipleDelete } = Methords; //选中和批量删除事件
+const { checkBtnPerm, downloadTemplate } = Utils; //按钮权限等工具
+
+const crudRef = ref(null); //crudRef.value 获取avue-crud对象
+const emit = defineEmits(["lineInfo"])
+const rowClick = (row)=>{
+  emit("lineInfo", row)
+}
+
+// 设置表格列或者其他自定义的option
+option.value = Object.assign(option.value, {
+  delBtn: false,
+  selection: false,
+  search: false,
+  editBtn: false,
+  addBtn: false,
+  viewBtn: false,
+  menu: false,
+  column: [
+    {
+      label: "订单编号",
+      prop: "orderCode",
+      search: true,
+      width: "125",
+      display: false,
+    },
+    {
+      label: "订单名称",
+      prop: "orderName",
+      search: true,
+      width: "100",
+    },
+    {
+      label: "ERP号",
+      prop: "erpCode",
+      search: true,
+      width: "100",
+    },
+    {
+      label: "产品编码",
+      prop: "materialCode",
+      search: true,
+      width: "100",
+    },
+    {
+      label: "产品名称",
+      prop: "materialName",
+      search: true,
+      width: "100",
+    },
+    {
+      label: "产品规格",
+      width: "100",
+      prop: "materialModel",
+    },
+    {
+      label: "订单状态",
+      prop: "orderState",
+      display: false,
+      width: "100",
+      type: "select", //类型为下拉选择框
+      dicUrl:
+          dictDataUtil.request_url + dictDataUtil.TYPE_CODE.plan_order_state,
+      props: {
+        label: "dictLabel",
+        value: "dictValue",
+      },
+      searchClearable: false, //可清空的输入框,默认为true
+      filterable: true, //添加filterable属性即可启用搜索功能
+    },
+    {
+      label: "订单类型",
+      prop: "orderType",
+      type: "select", //类型为下拉选择框
+      width: "100",
+      dicUrl: dictDataUtil.request_url + dictDataUtil.TYPE_CODE.plan_order_type,
+      props: {
+        label: "dictLabel",
+        value: "dictValue",
+      },
+      searchClearable: false, //可清空的输入框,默认为true
+      filterable: true, //添加filterable属性即可启用搜索功能
+    },
+    {
+      label: "订单数量",
+      prop: "orderNum",
+      type: "number",
+      width: "100",
+      min: 1,
+      max: 99999,
+    },
+    {
+      label: "排产数量",
+      prop: "scheduledNum",
+      width: "100",
+      display: false,
+    },
+    {
+      label: "优先级",
+      prop: "priority",
+      width: "100",
+      type: "select", //类型为下拉选择框
+      dicUrl:
+          dictDataUtil.request_url + dictDataUtil.TYPE_CODE.plan_order_priority,
+      props: {
+        label: "dictLabel",
+        value: "dictValue",
+      },
+      searchClearable: false, //可清空的输入框,默认为true
+      filterable: true, //添加filterable属性即可启用搜索功能
+    },
+    {
+      label: "交付日期",
+      prop: "deliverTime",
+      type: "date",
+      width: "100",
+      format: "YYYY-MM-DD", //前端展示格式
+      valueFormat: "YYYY-MM-DD", //设置后端接收的日期格式
+    },
+    {
+      label: "所属公司",
+      prop: "companyId",
+      width: "100",
+      type: "select", //类型为下拉选择框
+      dicUrl: import.meta.env.VITE_APP_BASE_API + "/api/v1/sys/dept/orgList",
+      props: {
+        label: "deptName",
+        value: "id",
+      },
+    },
+    {
+      label: "项目号",
+      width: "100",
+      prop: "projectCode",
+    },
+    {
+      label: "绑定铭牌",
+      prop: "nameplated",
+      width: "100",
+      type: "radio", //类型为单选框
+      dicData: [
+        {
+          label: "否",
+          value: 0,
+        },
+        {
+          label: "是",
+          value: 1,
+        },
+      ],
+      value: 0,
+    },
+    {
+      label: "备注",
+      prop: "remark",
+      width: "100",
+      minRows: 2, //最小行/最小值
+      type: "textarea", //类型为多行文本域框
+      maxlength: 512, //最大输入长度
+    },
+    {
+      label: "创建时间",
+      prop: "created",
+      width: "140",
+      overHidden: true,
+      type: "datetime",
+      valueFormat: "yyyy-MM-dd HH:mm:ss",
+    },
+    {
+      label: "创建人",
+      prop: "creator",
+      width: 80,
+      overHidden: true,
+    },
+  ],
+});
+
+onMounted(() => {
+  dataList();
+});
+</script>

+ 171 - 0
src/views/plan/workOrder/components/choice-route-page.vue

@@ -0,0 +1,171 @@
+<template>
+  <div class="mainContentBox">
+    <avue-crud
+        ref="crudRef"
+        v-model:search="search"
+        v-model="form"
+        :data="data"
+        :option="option"
+        v-model:page="page"
+        @row-click="rowClick"
+        @search-change="searchChange"
+        @search-reset="resetChange"
+        @size-change="dataList"
+        @current-change="dataList"
+    >
+    </avue-crud>
+  </div>
+</template>
+<script setup>
+import {defineProps, ref} from "vue";
+import { useCrud } from "@/hooks/userCrud";
+import { useCommonStoreHook } from "@/store";
+import dictDataUtil from "@/common/configs/dictDataUtil";
+const { isShowTable, tableType } = toRefs(useCommonStoreHook());
+const test = () => {
+  isShowTable.value = true;
+  tableType.value = tableType.value == 1 ? 2 : 1;
+};
+const props = defineProps({
+  materialCode: {
+    type: String,
+    default: () => {
+      return '';
+    }
+  }
+})
+// 传入一个url,后面不带/
+const { form, data, option, search, page, toDeleteIds, Methords, Utils } =
+  useCrud({
+    src: "/api/v1/op/route",
+  });
+const { dataList, createRow, updateRow, deleteRow, searchChange, resetChange } = Methords; //增删改查
+const { selectionChange, multipleDelete } = Methords; //选中和批量删除事件
+const { checkBtnPerm, downloadTemplate } = Utils; //按钮权限等工具
+const crudRef = ref(null); //crudRef.value 获取avue-crud对象
+const emit = defineEmits(["routeInfo"])
+const rowClick = (row)=>{
+  emit("routeInfo", row)
+}
+
+// 设置表格列或者其他自定义的option
+option.value = Object.assign(option.value, {
+  delBtn: false,
+  selection: false,
+  search: false,
+  editBtn: false,
+  addBtn: false,
+  viewBtn: false,
+  menu: false,
+  column: [
+    {
+      label: "工艺编号",
+      prop: "processRouteCode",
+      search: true,
+      width: 150,
+      addDisplay: false,
+      editDisabled: true,
+      overHidden: true,
+    },
+    {
+      label: "工艺名称",
+      prop: "processRouteName",
+      width: 150,
+      search: true,
+      overHidden: true,
+    },
+    {
+      label: "工艺类型",
+      prop: "processRouteType",
+      minWidth: 100,
+      overHidden: true,
+      type: "select",
+      dicUrl: dictDataUtil.request_url + dictDataUtil.TYPE_CODE.routing_type,
+      props: {
+        label: "dictLabel",
+        value: "dictValue",
+      },
+    },
+    {
+      label: "产品名称",
+      prop: "prodtName",
+      overHidden: true,
+      width: 150,
+    },
+    {
+      label: "产品编号",
+      prop: "prodtCode",
+      overHidden: true,
+      width: 150,
+      disabled: true,
+    },
+    {
+      label: "产品型号",
+      prop: "prodtModel",
+      overHidden: true,
+      minWidth: 200,
+    },
+    // 在产品那边绑定了工艺路线才是已绑定
+    {
+      label: "路线状态",
+      prop: "used",
+      width: 100,
+      type: "radio",
+      dicData: [
+        {
+          label: "已绑定",
+          value: 1,
+        },
+        {
+          label: "未绑定",
+          value: 0,
+        },
+      ],
+    },
+    {
+      label: "启用状态",
+      prop: "enabled",
+      width: 100,
+      type: "radio",
+      dicData: [
+        {
+          label: "未启用",
+          value: 1,
+        },
+        {
+          label: "启用",
+          value: 0,
+        },
+      ],
+      value: 0,
+    },
+    {
+      label: "版本",
+      prop: "processRouteVersion",
+      addDisplay: false,
+      editDisplay: false,
+    },
+    {
+      label: "创建人",
+      prop: "createBy",
+      addDisplay: false,
+      editDisplay: false,
+      overHidden: true,
+    },
+    {
+      label: "创建时间",
+      prop: "createWhen",
+      addDisplay: false,
+      editDisplay: false,
+      width: 150,
+      overHidden: true,
+    },
+  ],
+});
+
+onMounted(() => {
+  search.value.prodtCode = props.materialCode
+  search.value.enabled = "0"
+  dataList();
+});
+</script>

+ 216 - 0
src/views/plan/workOrder/components/choice-workshop-page.vue

@@ -0,0 +1,216 @@
+<template>
+  <div class="mainContentBox">
+    <avue-crud
+        ref="crudRef"
+        v-model:search="search"
+        v-model="form"
+        :data="data"
+        :option="option"
+        v-model:page="page"
+        @row-click="rowClick"
+        @search-change="searchChange"
+        @search-reset="resetChange"
+        @size-change="dataList"
+        @current-change="dataList"
+    >
+    </avue-crud>
+  </div>
+</template>
+<script setup>
+import { ref } from "vue";
+import { useCrud } from "@/hooks/userCrud";
+
+import { useCommonStoreHook } from "@/store";
+import dictDataUtil from "@/common/configs/dictDataUtil";
+const { isShowTable, tableType } = toRefs(useCommonStoreHook());
+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/workShop",
+  });
+const { dataList, createRow, updateRow, deleteRow, searchChange, resetChange } = Methords; //增删改查
+const { selectionChange, multipleDelete } = Methords; //选中和批量删除事件
+const { checkBtnPerm, downloadTemplate } = Utils; //按钮权限等工具
+
+const crudRef = ref(null); //crudRef.value 获取avue-crud对象
+const emit = defineEmits(["workShopInfo"])
+const rowClick = (row)=>{
+  emit("workShopInfo", row)
+}
+
+// 设置表格列或者其他自定义的option
+option.value = Object.assign(option.value, {
+  delBtn: false,
+  selection: false,
+  search: false,
+  editBtn: false,
+  addBtn: false,
+  viewBtn: false,
+  menu: false,
+  column: [
+    {
+      label: "订单编号",
+      prop: "orderCode",
+      search: true,
+      width: "125",
+      display: false,
+    },
+    {
+      label: "订单名称",
+      prop: "orderName",
+      search: true,
+      width: "100",
+    },
+    {
+      label: "ERP号",
+      prop: "erpCode",
+      search: true,
+      width: "100",
+    },
+    {
+      label: "产品编码",
+      prop: "materialCode",
+      search: true,
+      width: "100",
+    },
+    {
+      label: "产品名称",
+      prop: "materialName",
+      search: true,
+      width: "100",
+    },
+    {
+      label: "产品规格",
+      width: "100",
+      prop: "materialModel",
+    },
+    {
+      label: "订单状态",
+      prop: "orderState",
+      display: false,
+      width: "100",
+      type: "select", //类型为下拉选择框
+      dicUrl:
+          dictDataUtil.request_url + dictDataUtil.TYPE_CODE.plan_order_state,
+      props: {
+        label: "dictLabel",
+        value: "dictValue",
+      },
+      searchClearable: false, //可清空的输入框,默认为true
+      filterable: true, //添加filterable属性即可启用搜索功能
+    },
+    {
+      label: "订单类型",
+      prop: "orderType",
+      type: "select", //类型为下拉选择框
+      width: "100",
+      dicUrl: dictDataUtil.request_url + dictDataUtil.TYPE_CODE.plan_order_type,
+      props: {
+        label: "dictLabel",
+        value: "dictValue",
+      },
+      searchClearable: false, //可清空的输入框,默认为true
+      filterable: true, //添加filterable属性即可启用搜索功能
+    },
+    {
+      label: "订单数量",
+      prop: "orderNum",
+      type: "number",
+      width: "100",
+      min: 1,
+      max: 99999,
+    },
+    {
+      label: "排产数量",
+      prop: "scheduledNum",
+      width: "100",
+      display: false,
+    },
+    {
+      label: "优先级",
+      prop: "priority",
+      width: "100",
+      type: "select", //类型为下拉选择框
+      dicUrl:
+          dictDataUtil.request_url + dictDataUtil.TYPE_CODE.plan_order_priority,
+      props: {
+        label: "dictLabel",
+        value: "dictValue",
+      },
+      searchClearable: false, //可清空的输入框,默认为true
+      filterable: true, //添加filterable属性即可启用搜索功能
+    },
+    {
+      label: "交付日期",
+      prop: "deliverTime",
+      type: "date",
+      width: "100",
+      format: "YYYY-MM-DD", //前端展示格式
+      valueFormat: "YYYY-MM-DD", //设置后端接收的日期格式
+    },
+    {
+      label: "所属公司",
+      prop: "companyId",
+      width: "100",
+      type: "select", //类型为下拉选择框
+      dicUrl: import.meta.env.VITE_APP_BASE_API + "/api/v1/sys/dept/orgList",
+      props: {
+        label: "deptName",
+        value: "id",
+      },
+    },
+    {
+      label: "项目号",
+      width: "100",
+      prop: "projectCode",
+    },
+    {
+      label: "绑定铭牌",
+      prop: "nameplated",
+      width: "100",
+      type: "radio", //类型为单选框
+      dicData: [
+        {
+          label: "否",
+          value: 0,
+        },
+        {
+          label: "是",
+          value: 1,
+        },
+      ],
+      value: 0,
+    },
+    {
+      label: "备注",
+      prop: "remark",
+      width: "100",
+      minRows: 2, //最小行/最小值
+      type: "textarea", //类型为多行文本域框
+      maxlength: 512, //最大输入长度
+    },
+    {
+      label: "创建时间",
+      prop: "created",
+      width: "140",
+      overHidden: true,
+      type: "datetime",
+      valueFormat: "yyyy-MM-dd HH:mm:ss",
+    },
+    {
+      label: "创建人",
+      prop: "creator",
+      width: 80,
+      overHidden: true,
+    },
+  ],
+});
+
+onMounted(() => {
+  dataList();
+});
+</script>

+ 242 - 385
src/views/plan/workOrder/index.vue

@@ -1,499 +1,356 @@
 <template>
   <div class="mainContentBox">
     <avue-crud
-      :option="option"
-      v-model:page="page"
-      v-model:search="search"
-      :table-loading="loading"
-      :permission="permission"
-      @search-change="handleQuery"
-      @search-reset="resetQuery"
-      @size-change="handleQuery"
-      @current-change="handleQuery"
-      @row-save="rowSave"
-      @row-update="rowUpdate"
-      @row-del="rowDel"
-      :data="pageData"
+        ref="crudRef"
+        v-model:search="search"
+        v-model="form"
+        :data="data"
+        :option="option"
+        v-model:page="page"
+        @row-save="createRow"
+        @row-update="updateRow"
+        @row-del="deleteRow"
+        @search-change="searchChange"
+        @search-reset="resetChange"
+        @size-change="dataList"
+        @current-change="dataList"
+        @selection-change="selectionChange"
     >
-      <template #menu-right="{}">
-        <el-dropdown split-button v-hasPerm="['plan:order:import']"
-          >导入
-          <template #dropdown>
-            <el-dropdown-menu>
-              <el-dropdown-item @click="downloadTemplate">
-                <i-ep-download />下载模板
-              </el-dropdown-item>
-              <el-dropdown-item @click="openDialog('obj-import')">
-                <i-ep-top />导入数据
-              </el-dropdown-item>
-            </el-dropdown-menu>
-          </template>
-        </el-dropdown>
+      <template #menu-left="{ size }">
         <el-button
-          class="ml-3"
-          v-hasPerm="['plan:order:export']"
-          @click="handleExport"
+          :disabled="toDeleteIds.length < 1"
+          type="danger"
+          icon="el-icon-delete"
+          :size="size"
+          @click="multipleDelete"
+          >删除</el-button
         >
-          <template #icon> <i-ep-download /> </template>导出
-        </el-button>
       </template>
     </avue-crud>
+    <el-dialog
+        v-model="dialog.visible"
+        :title="dialog.title"
+        width="80%"
+        @close="dialog.visible = false"
+    >
+      <order-page queryType="1"  @orderInfo="orderInfo"/>
+    </el-dialog>
 
     <el-dialog
-      v-model="dialog.visible"
-      :title="dialog.title"
-      width="500px"
-      @close="closeDialog"
+        v-model="dialog1.visible"
+        :title="dialog1.title"
+        width="80%"
+        @close="dialog1.visible = false"
     >
-      <el-form
-        v-if="dialog.type === 'obj-import'"
-        :model="importData"
-        label-width="100px"
-      >
-        <el-form-item label="Excel文件">
-          <el-upload
-            ref="uploadRef"
-            action=""
-            drag
-            accept="application/vnd.openxmlformats-officedocument.spreadsheetml.sheet, application/vnd.ms-excel"
-            :limit="1"
-            :auto-upload="false"
-            :file-list="importData.fileList"
-            :on-change="handleFileChange"
-            :on-exceed="handleFileExceed"
-          >
-            <el-icon class="el-icon--upload">
-              <i-ep-upload-filled />
-            </el-icon>
-            <div class="el-upload__text">
-              将文件拖到此处,或
-              <em>点击上传</em>
-            </div>
-            <template #tip>
-              <div style="color: red">文件类型: xls/xlsx</div>
-            </template>
-          </el-upload>
-        </el-form-item>
-      </el-form>
-      <!-- 弹窗底部操作按钮 -->
-      <template #footer>
-        <div class="dialog-footer">
-          <el-button type="primary" @click="handleSubmit">确 定</el-button>
-          <el-button @click="closeDialog">取 消</el-button>
-        </div>
-      </template>
+      <choice-route-page :material-code="form.materialCode" @routeInfo="routeInfo"/>
+    </el-dialog>
+
+    <el-dialog
+        v-model="dialog2.visible"
+        :title="dialog2.title"
+        width="80%"
+        @close="dialog2.visible = false"
+    >
+      <choice-workshop-page  @workShopInfo="workShopInfo"/>
+    </el-dialog>
+
+    <el-dialog
+        v-model="dialog3.visible"
+        :title="dialog3.title"
+        width="80%"
+        @close="dialog3.visible = false"
+    >
+      <choice-line-page  @orderInfo="lineInfo"/>
     </el-dialog>
   </div>
 </template>
-<script setup lang="ts">
-import { checkPerm } from "@/directive/permission";
-import type { UploadInstance } from "element-plus";
-import { genFileId } from "element-plus";
-import dictDataUtil from "@/common/configs/dictDataUtil";
-import buttonPermission from "@/common/configs/buttonPermission";
-import {
-  addOrder,
-  deleteOrders,
-  downloadTemplateApi,
-  exportOrder,
-  getOrderPage,
-  importOrder,
-  updateOrder,
-  getExpandAlias,
-} from "@/api/order";
+<script setup>
+import { ref, getCurrentInstance } from "vue";
+import { useCrud } from "@/hooks/userCrud";
+import ButtonPermKeys from "@/common/configs/buttonPermission";
 
-// 弹窗对象
+import { useCommonStoreHook } from "@/store";
+import dictDataUtil from "@/common/configs/dictDataUtil";
+import ChoiceRoutePage from "./components/choice-route-page.vue";
+import ChoiceWorkshopPage from "./components/choice-workshop-page.vue";
+const { isShowTable, tableType } = toRefs(useCommonStoreHook());
+const test = () => {
+  isShowTable.value = true;
+  tableType.value = tableType.value == 1 ? 2 : 1;
+};
 const dialog = reactive({
+  title: "订单选择",
   visible: false,
-  type: "order-form",
-  width: 800,
-  title: "",
 });
-const search = ref({});
-const option = ref({});
-const pageData = ref([]);
-const form = ref({});
-const page = ref({ total: 0, currentPage: 1, pageSize: 10 });
-const loading = ref(false);
-const uploadRef = ref<UploadInstance>(); // 上传组件
-// 导入数据
-const importData = reactive({
-  file: undefined,
-  fileList: [],
+const dialog1 = reactive({
+  title: "工艺选择",
+  visible: false,
 });
-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 dialog2 = reactive({
+  title: "车间选择",
+  visible: false,
+});
+const dialog3 = reactive({
+  title: "产线选择",
+  visible: false,
 });
-option.value = {
-  border: true,
-  searchIndex: 3,
-  searchIcon: true,
-  searchMenuSpan: 8,
-  align: "center",
-  menuAlign: "center",
-  search: true,
-  refreshBtn: false,
-  from: {
-    width: "300",
-  },
+const orderInfo = (value) => {
+  form.value.orderCode = value.orderCode
+  form.value.orderName = value.orderName
+  form.value.materialCode = value.materialCode
+  form.value.materialName = value.materialName
+  form.value.materialModel = value.materialModel
+  form.value.priority = value.priority
+  dialog.visible = false
+}
+const lineInfo = (value) => {
+  form.value.orderCode = value.orderCode
+  dialog3.visible = false
+}
+const workShopInfo = (value) => {
+  form.value.workShopId = value.id
+  form.value.workShopName = value.id
+  dialog2.visible = false
+}
+const routeInfo = (value) => {
+  form.value.processRouteId = value.id
+  form.value.processRouteCode = value.processRouteCode
+  form.value.processRouteName = value.processRouteName
+  dialog1.visible = false
+}
+// 传入一个url,后面不带/
+const { form, data, option, search, page, toDeleteIds, Methords, Utils } =
+  useCrud({
+    src: "/api/v1/plan/workOrder",
+  });
+const { dataList, createRow, updateRow, deleteRow, searchChange, resetChange } = Methords; //增删改查
+const { selectionChange, multipleDelete } = Methords; //选中和批量删除事件
+const { checkBtnPerm, downloadTemplate, exportData } = Utils; //按钮权限等工具
+
+const crudRef = ref(null); //crudRef.value 获取avue-crud对象
+
+// 设置表格列或者其他自定义的option
+option.value = Object.assign(option.value, {
+  delBtn: false,
+  selection: false,
   column: [
     {
-      label: "订单编号",
-      prop: "orderCode",
+      label: "单编号",
+      prop: "workOrderCode",
       search: true,
-      width: "100",
       display: false,
+      width: 115,
     },
     {
-      label: "订单名称",
-      prop: "orderName",
+      label: "订单编号",
+      prop: "orderCode",
       search: true,
-      width: "100",
+      width: 115,
       rules: [
         {
           required: true,
-          message: "订单名称不能为空",
+          message: "订单编号不能为空",
           trigger: "trigger",
         },
       ],
+      click: ({ value, column }) => {
+        if(column.boxType){
+          dialog.visible = true
+        }
+      },
     },
     {
-      label: "ERP号",
-      prop: "erpCode",
+      label: "订单名称",
+      prop: "orderName",
       search: true,
-      width: "100",
-      rules: [
-        {
-          required: true,
-          message: "订单编号不能为空",
-          trigger: "trigger",
-        },
-      ],
+      disabled: true,
+      width: 120,
     },
     {
-      label: "产品编",
-      prop: "materialCode",
+      label: "产品编号",
+      width: 120,
       search: true,
-      width: "100",
-      rules: [
-        {
-          required: true,
-          message: "订单编号不能为空",
-          trigger: "trigger",
-        },
-      ],
-      focus: ({ value, column }) => {
-        //todo
-      },
+      disabled: true,
+      prop: "materialCode",
     },
     {
       label: "产品名称",
-      prop: "materialName",
+      width: 120,
       search: true,
-      width: "100",
+      disabled: true,
+      prop: "materialName",
     },
     {
       label: "产品规格",
-      width: "100",
+      width: 120,
+      search: true,
+      overHidden: true,
+      disabled: true,
       prop: "materialModel",
     },
     {
-      label: "订单状态",
-      prop: "orderState",
+      label: "优先级",
+      prop: "priority",
       display: false,
-      width: "100",
+      width: "80",
       type: "select", //类型为下拉选择框
       dicUrl:
-        dictDataUtil.request_url + dictDataUtil.TYPE_CODE.plan_order_state,
+          dictDataUtil.request_url + dictDataUtil.TYPE_CODE.plan_order_priority,
       props: {
         label: "dictLabel",
         value: "dictValue",
       },
-      searchClearable: false, //可清空的输入框,默认为true
-      filterable: true, //添加filterable属性即可启用搜索功能
     },
     {
-      label: "订单类型",
-      prop: "orderType",
+      label: "状态",
+      prop: "workOrderState",
+      width: "80",
+      display: false,
       type: "select", //类型为下拉选择框
-      width: "100",
-      dicUrl: dictDataUtil.request_url + dictDataUtil.TYPE_CODE.plan_order_type,
+      dicUrl:
+          dictDataUtil.request_url + dictDataUtil.TYPE_CODE.plan_work_order_state,
       props: {
         label: "dictLabel",
         value: "dictValue",
       },
-      searchClearable: false, //可清空的输入框,默认为true
-      filterable: true, //添加filterable属性即可启用搜索功能
+    },
+    {
+      label: "工艺路线",
+      prop: "processRouteName",
+      width: 120,
+      overHidden: true,
       rules: [
         {
           required: true,
-          message: "订单类型不能为空",
+          message: "工艺路线不能为空",
           trigger: "trigger",
         },
       ],
+      click: ({ value, column }) => {
+        if(column.boxType){
+          if(!form.value.materialCode){
+            ElMessage({
+              message: "请先选择订单",
+              type: "warning",
+            })
+            return;
+          }
+          dialog1.visible = true
+        }
+      },
     },
     {
-      label: "订单数量",
-      prop: "orderNum",
-      type: "number",
-      width: "100",
-      min: 0,
-      max: 99999,
+      label: "生产车间",
+      prop: "workshopName",
+      width: 120,
+      overHidden: true,
       rules: [
         {
           required: true,
-          message: "订单数量不能为空",
+          message: "生产车间不能为空",
           trigger: "trigger",
         },
       ],
+      click: ({ value, column }) => {
+        if(column.boxType){
+          dialog2.visible = true
+        }
+      },
     },
     {
-      label: "排产数量",
-      prop: "scheduledNum",
-      width: "100",
-      display: false,
-    },
-    {
-      label: "优先级",
-      prop: "priority",
-      width: "100",
-      type: "select", //类型为下拉选择框
-      dicUrl:
-        dictDataUtil.request_url + dictDataUtil.TYPE_CODE.plan_order_priority,
-      props: {
-        label: "dictLabel",
-        value: "dictValue",
-      },
-      searchClearable: false, //可清空的输入框,默认为true
-      filterable: true, //添加filterable属性即可启用搜索功能
+      label: "产线名称",
+      prop: "productLineName",
+      width: 120,
+      overHidden: true,
       rules: [
         {
           required: true,
-          message: "订单类型不能为空",
+          message: "产线名称不能为空",
           trigger: "trigger",
         },
       ],
+      click: ({ value, column }) => {
+        if(column.boxType){
+          dialog3.visible = true
+        }
+      },
     },
     {
-      label: "交付日期",
-      prop: "deliverTime",
-      type: "date",
-      width: "100",
-      format: "YYYY-MM-DD", //前端展示格式
-      valueFormat: "YYYY-MM-DD", //设置后端接收的日期格式
+      label: "开始时间",
+      prop: "planStartWhen",
+      width: 120,
+      overHidden: true,
+      display: false,
+    },
+    {
+      label: "结束时间",
+      prop: "planStartEnd",
+      width: 120,
+      display: false,
+      overHidden: true,
+    },
+    {
+      label: "工单数量",
+      prop: "planNum",
+      width: 85,
       rules: [
         {
           required: true,
-          message: "请选择交付日期",
+          message: "工单数量不能为空",
           trigger: "trigger",
         },
       ],
     },
     {
-      label: "所属公司",
-      prop: "companyId",
-      width: "100",
-    },
-    {
-      label: "项目号",
-      width: "100",
-      prop: "projectCode",
+      label: "完成数量",
+      width: 85,
+      display: false,
+      prop: "completeNum",
+
     },
     {
-      label: "绑定铭牌",
-      prop: "nameplated",
-      width: "100",
-      type: "radio", //类型为单选框
-      dicData: [
-        {
-          label: "否",
-          value: 0,
-        },
-        {
-          label: "是",
-          value: 1,
-        },
-      ],
-      value: 0,
+      label: "下线数量",
+      width: 85,
+      display: false,
+      prop: "beforeNum",
     },
     {
-      label: "备注",
-      prop: "remark",
-      width: "100",
-      minRows: 2, //最小行/最小值
-      type: "textarea", //类型为多行文本域框
-      maxlength: 512, //最大输入长度
+      label: "报废数量",
+      width: 85,
+      display: false,
+      prop: "scrapNum",
     },
     {
       label: "创建时间",
-      prop: "created",
-      width: "140",
-      overHidden: true,
+      width: 100,
       display: false,
-      type: "datetime",
-      valueFormat: "yyyy-MM-dd HH:mm:ss",
+      prop: "created",
     },
     {
       label: "创建人",
-      prop: "creator",
+      width: 90,
       display: false,
-      width: 80,
-      overHidden: true,
+      prop: "creator",
     },
   ],
-};
-
-const queryExpandAlias = () => {
-  getExpandAlias(dictDataUtil.EXPAND_FIELD_TABLE.plan_order_info).then(
-    (data: any) => {
-      if (data.data) {
-        data.data.forEach((item: any) => {
-          option.value.column.push({
-            label: item.label,
-            prop: item.field,
-            width: "100",
-          });
-        });
-      }
-    }
-  );
-};
+});
 
-const handleQuery = (params, done) => {
-  console.log(JSON.stringify(option.value.column));
-  loading.value = true;
-  const querySearch = {
-    pageSize: page.value.pageSize,
-    pageNo: page.value.currentPage,
-    ...params,
-  };
-  getOrderPage(querySearch)
-    .then(({ data }) => {
-      pageData.value = data.records;
-      page.value.total = data.totalCount;
-      page.value.currentPage = data.pageNo;
-      page.value.pageSize = data.pageSize;
-    })
-    .finally(() => {
-      loading.value = false;
-      if (done) {
-        done();
-      }
-    });
-};
-const resetQuery = () => {};
-const rowSave = (form, done, loading) => {
-  loading();
-  addOrder(form).then((data: any) => {
-    ElMessage({
-      message: data.msg,
-      type: "success",
-    });
-    done();
-    handleQuery(null, null);
-  });
-};
-const rowUpdate = (form, index, done, loading) => {
-  loading();
-  updateOrder(form).then((data: any) => {
-    ElMessage({
-      message: data.msg,
-      type: "success",
-    });
-    done();
-    handleQuery(null, null);
-  });
-};
-const rowDel = (form: any, index) => {
-  ElMessageBox.confirm("当前操作会删除数据,你确认要继续吗?")
-    .then(() => {
-      deleteOrders([form.id])
-        .then((data: any) => {
-          ElMessage({
-            message: data.msg,
-            type: "success",
-          });
-          handleQuery(null, null);
-        })
-        .finally(() => {});
-    })
-    .catch(() => {
-      // catch error
-    });
-};
-const openDialog = (type) => {
-  dialog.visible = true;
-  dialog.type = type;
-  if (dialog.type === "obj-import") {
-    // 导入弹窗
-    dialog.title = "数据导入";
-    dialog.width = 600;
-  }
+onMounted(() => {
+  // console.log("crudRef", crudRef)
+  dataList();
+});
+/**
+ * 上传excel相关
+ */
+const uploadRef = ref(null);
+const uploadFinished = () => {
+  // 上传完成后的刷新操作
+  page.currentPage = 1;
+  dataList();
 };
-const closeDialog = () => {
-  dialog.visible = false;
-  if (dialog.type === "obj-import") {
-    importData.file = undefined;
-    importData.fileList = [];
+const importExcelData = () => {
+  if (uploadRef.value) {
+    uploadRef.value.show("/api/v1/device/import");
   }
 };
-const downloadTemplate = () => {
-  downloadTemplateApi().then((response) => {
-    downFile(response);
-  });
-};
-/** 弹窗提交 */
-const handleSubmit = () => {
-  importOrder(importData).then((data: any) => {
-    ElMessage({
-      message: data.msg,
-      type: "success",
-    });
-    dialog.visible = false;
-    handleQuery(null, null);
-  });
-};
-/** Excel文件 Change */
-const handleFileChange = (file) => {
-  importData.file = file.raw;
-};
-/** 文件下载 */
-const downFile = (response: any) => {
-  const fileData = response.data;
-  const fileName = decodeURI(
-    response.headers["content-disposition"].split(";")[1].split("=")[1]
-  );
-  const fileType =
-    "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet;charset=utf-8";
-  const blob = new Blob([fileData], { type: fileType });
-  const downloadUrl = window.URL.createObjectURL(blob);
-  const downloadLink = document.createElement("a");
-  downloadLink.href = downloadUrl;
-  downloadLink.download = fileName;
-  document.body.appendChild(downloadLink);
-  downloadLink.click();
-  document.body.removeChild(downloadLink);
-  window.URL.revokeObjectURL(downloadUrl);
-};
-/** Excel文件 Exceed  */
-const handleFileExceed = (files) => {
-  uploadRef.value!.clearFiles();
-  const file = files[0];
-  file.uid = genFileId();
-  uploadRef.value!.handleStart(file);
-  importData.file = file;
-};
-/** 导出 */
-const handleExport = () => {
-  exportOrder(search.value).then((response: any) => {
-    downFile(response);
-  });
-};
-onMounted?.(() => {
-  queryExpandAlias();
-  handleQuery(null, null);
-});
 </script>

+ 178 - 0
src/views/storage/stock/index.vue

@@ -0,0 +1,178 @@
+<template>
+  <div class="mainContentBox">
+    <avue-crud
+        ref="crudRef"
+        v-model:search="search"
+        v-model="form"
+        :data="data"
+        :option="option"
+        v-model:page="page"
+        @row-save="createRow"
+        @row-update="updateRow"
+        @row-del="deleteRow"
+        @search-change="searchChange"
+        @search-reset="resetChange"
+        @size-change="dataList"
+        @current-change="dataList"
+        @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>
+    <ExcelUpload ref="uploadRef" @finished="uploadFinished" />
+  </div>
+</template>
+<script setup>
+import { ref, getCurrentInstance } from "vue";
+import { useCrud } from "@/hooks/userCrud";
+import ButtonPermKeys from "@/common/configs/buttonPermission";
+
+import { useCommonStoreHook } from "@/store";
+import dictDataUtil from "@/common/configs/dictDataUtil";
+const { isShowTable, tableType } = toRefs(useCommonStoreHook());
+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/wms/position",
+  });
+const { dataList, createRow, updateRow, deleteRow, searchChange, resetChange } = Methords; //增删改查
+const { selectionChange, multipleDelete } = Methords; //选中和批量删除事件
+const { checkBtnPerm, downloadTemplate, exportData } = Utils; //按钮权限等工具
+
+const crudRef = ref(null); //crudRef.value 获取avue-crud对象
+
+// 设置表格列或者其他自定义的option
+option.value = Object.assign(option.value, {
+  delBtn: false,
+  selection: true,
+  column: [
+    {
+      label: "仓库编码",
+      prop: "type",
+      type: "select",
+      search: true,
+      editDisabled: true,
+      dicUrl:
+          dictDataUtil.request_url +
+          dictDataUtil.TYPE_CODE.warehouse_type,
+      props: {
+        label: "dictLabel",
+        value: "dictValue",
+      },
+      rules: [
+        {
+          required: true,
+          message: "仓库编码不能为空",
+          trigger: "trigger",
+        },
+      ],
+    },
+    {
+      label: "货区",
+      prop: "area",
+      rules: [
+        {
+          required: true,
+          message: "货区不能为空",
+          trigger: "trigger",
+        },
+      ],
+    },
+    {
+      label: "货位",
+      prop: "coordinate",
+      search: true,
+      rules: [
+        {
+          required: true,
+          message: "货位不能为空",
+          trigger: "trigger",
+        },
+      ],
+    },
+    {
+      label: "层数",
+      prop: "layer",
+      type: "number",
+      rules: [
+        {
+          required: true,
+          message: "层数不能为空",
+          trigger: "trigger",
+        },
+      ],
+    },
+    {
+      label: "货位类型",
+      prop: "materialType",
+      type: "select",
+      dicUrl:
+          dictDataUtil.request_url +
+          dictDataUtil.TYPE_CODE.storage_location_type,
+      props: {
+        label: "dictLabel",
+        value: "dictValue",
+      },
+      rules: [
+        {
+          required: true,
+          message: "货位类型不能为空",
+          trigger: "trigger",
+        },
+      ],
+    },
+    {
+      label: "状态",
+      prop: "enable",
+      type: "select",
+      dicData: [{label: '启用' , value: 0},{label: '禁用' , value: 1}],
+      html: true,
+      formatter: (val) => {
+        if (val.state === 0) {
+          return '<b class="el-tag el-tag--success el-tag--light">启用</b>';
+        }
+        return '<b class="el-tag el-tag--danger el-tag--light">禁用</b>';
+      },
+      rules: [
+        {
+          required: true,
+          message: "状态不能为空",
+          trigger: "trigger",
+        },
+      ],
+    },
+  ],
+});
+
+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/device/import");
+  }
+};
+</script>

+ 1 - 1
src/views/system/dict/components/dict-item.vue

@@ -221,7 +221,7 @@ onMounted?.(() => {
       <template #header>
         <el-button
           v-hasPerm="[ButtonPermKeys.SYSTEM.BTNS.dict_add]"
-          type="success"
+          type="primary"
           @click="openDialog()"
           ><i-ep-plus />新增</el-button
         >