quwangxin 3 anos atrás
pai
commit
d93f6fa875

+ 13 - 0
src/api/mianData/index.js

@@ -0,0 +1,13 @@
+import request from '@/utils/request';
+
+// 根据工艺路线编码获取工序
+export async function getProcessByRoute (data) {
+  const res = await request.post(
+    '/main/producerouting/taskinstance/page',
+    data
+  );
+  if (res.data.code == 0) {
+    return res.data.data;
+  }
+  return Promise.reject(new Error(res.data.message));
+}

+ 10 - 2
src/api/produceOrder/index.js

@@ -49,8 +49,16 @@ export async function cancelCompletion (id) {
   return Promise.reject(new Error(res.data.message));
 }
 // 领料保存
-export async function batchSave (id) {
-  const res = await request.post(`/mes/pickorder/batchSave`);
+export async function batchSave (data) {
+  const res = await request.post(`/mes/pickorder/batchSave`, data);
+  if (res.data.code == 0) {
+    return res.data.data;
+  }
+  return Promise.reject(new Error(res.data.message));
+}
+// 工单详情
+export async function getById (id) {
+  const res = await request.get(`/mes/workorder/getById/${id}`);
   if (res.data.code == 0) {
     return res.data.data;
   }

+ 75 - 0
src/components/CommomSelect/person-select-remote.vue

@@ -0,0 +1,75 @@
+<template>
+  <el-select
+    v-model="selectVal"
+    filterable
+    style="width: 100%"
+    v-bind="$attrs"
+    v-on="$listeners"
+    reserve-keyword
+    remote
+    placeholder="请输入关键词"
+    :remote-method="remoteMethod"
+    :loading="loading"
+    clearable
+  >
+    <el-option
+      v-for="item in dictList"
+      :key="item.id"
+      :value="item.id"
+      :label="`${item.jobNumber}(${item.name})`"
+    ></el-option>
+  </el-select>
+</template>
+
+<script>
+  import { getUserPage } from '@/api/system/organization';
+  export default {
+    model: {
+      prop: 'value',
+      event: 'updateVal'
+    },
+    props: {
+      value: {
+        type: [String, Number, Array],
+        default: ''
+      }
+    },
+    data () {
+      return {
+        loading: false,
+        dictList: []
+      };
+    },
+    computed: {
+      selectVal: {
+        set (val) {
+          this.$emit(
+            'selfChange',
+            val,
+            this.dictList.find((i) => i.id === val)
+          );
+          this.$emit('updateVal', val);
+        },
+        get () {
+          return this.value;
+        }
+      }
+    },
+    created () {},
+    methods: {
+      async remoteMethod (query) {
+        this.loading = true;
+        getUserPage({ pageNum: 1, size: -1, jobNumber: query })
+          .then((res) => {
+            this.dictList = res.list;
+          })
+          .catch(() => {
+            this.dictList = [];
+          })
+          .finally(() => {
+            this.loading = false;
+          });
+      }
+    }
+  };
+</script>

+ 73 - 0
src/components/CommomSelect/person-select.vue

@@ -0,0 +1,73 @@
+<template>
+  <el-select
+    v-model="selectVal"
+    filterable
+    style="width: 100%"
+    v-bind="$attrs"
+    v-on="$listeners"
+    clearable
+  >
+    <el-option
+      v-for="item in dictList"
+      :key="item.id"
+      :value="item.id"
+      :label="item.name"
+    ></el-option>
+  </el-select>
+</template>
+
+<script>
+  import { getUserPage } from '@/api/system/organization';
+  export default {
+    model: {
+      prop: 'value',
+      event: 'updateVal'
+    },
+    props: {
+      value: {
+        type: [String, Number, Array],
+        default: ''
+      },
+      init: {
+        type: Boolean,
+        default: true
+      }
+    },
+    data () {
+      return {
+        dictList: []
+      };
+    },
+    computed: {
+      selectVal: {
+        set (val) {
+          this.$emit(
+            'selfChange',
+            val,
+            this.dictList.find((i) => i.id === val)
+          );
+          this.$emit('updateVal', val);
+        },
+        get () {
+          return this.value;
+        }
+      }
+    },
+    created () {
+      if (this.init) {
+        this.getList();
+      }
+    },
+    methods: {
+      async getList (params) {
+        let data = { pageNum: 1, size: -1 };
+        // 如果传了参数就是获取巡点检人员数据
+        if (params) {
+          data = Object.assign(data, params);
+        }
+        const res = await getUserPage(data);
+        this.dictList = res.list;
+      }
+    }
+  };
+</script>

+ 16 - 14
src/components/material/ChooseMaterial.vue

@@ -67,7 +67,7 @@
     components: {
       AssetTree
     },
-    data () {
+    data() {
       return {
         materialdialog: false,
         selectionList: [],
@@ -119,7 +119,7 @@
       };
     },
     watch: {
-      selectionList (newVal, oldVal) {
+      selectionList(newVal, oldVal) {
         console.log(newVal, oldVal);
         if (newVal.length < oldVal.length) {
           const arr = oldVal.filter(
@@ -133,56 +133,58 @@
       }
     },
     methods: {
-      open (memoList) {
+      open(memoList) {
         this.memoList = memoList;
         this.materialdialog = true;
         if (this.current?.id) {
           this.reload();
         }
       },
-      handleNodeClick (info) {
+      handleNodeClick(info) {
         this.current = info;
         this.reload();
       },
       // 获取根节点id
-      setRootId (id) {
+      setRootId(id) {
         this.rootId = id;
       },
-      handleDone ({ data }) {
+      handleDone({ data }) {
         if (this.memoList.length && data.length) {
           this.$nextTick(() => {
-            this.$refs.table.setSelectedRowKeys(this.memoList.map((i) => i.id));
+            this.$refs.table.setSelectedRowKeys(
+              this.memoList.map((i) => i.materialId)
+            );
           });
         }
       },
-      selectionChange (...rest) {
+      selectionChange(...rest) {
         console.log(rest);
       },
-      handleClose () {
+      handleClose() {
         this.materialdialog = false;
         this.searchKey = '';
       },
 
-      datasource ({ page, limit }) {
+      datasource({ page, limit }) {
         return getList({
           pageNum: page,
           size: limit,
           searchKey: this.searchKey
         });
       },
-      reload () {
+      reload() {
         this.$refs.table.reload();
       },
       // 弹窗 - 按关键字搜索
-      searchByKeyWords () {
+      searchByKeyWords() {
         this.reload();
       },
       // 重置
-      reset () {
+      reset() {
         this.searchKey = '';
         this.reload();
       },
-      selected () {
+      selected() {
         if (!this.selectionList.length) {
           return this.$message.error('请选择物料!');
         }

+ 1 - 0
src/enum/dict.js

@@ -8,6 +8,7 @@ export default {
   生命周期: 'life_cycle',
   网络状态: 'network_status',
   金额单位: 'money_unit',
+  仓库: 'warehouse',
   时间单位: 'time_unit'
 };
 export const numberList = [];

+ 68 - 60
src/store/modules/theme.js

@@ -1,3 +1,4 @@
+import Vue from 'vue';
 /**
  * 主题状态管理
  */
@@ -86,7 +87,7 @@ let disableTransitionTimer, updateContentSizeTimer;
 /**
  * 读取缓存配置
  */
-function getCacheSetting() {
+function getCacheSetting () {
   try {
     const value = localStorage.getItem(THEME_STORE_NAME);
     if (value) {
@@ -104,7 +105,7 @@ function getCacheSetting() {
 /**
  * 缓存配置
  */
-function cacheSetting(key, value) {
+function cacheSetting (key, value) {
   const cache = getCacheSetting();
   if (cache[key] !== value) {
     cache[key] = value;
@@ -115,7 +116,7 @@ function cacheSetting(key, value) {
 /**
  * 开关响应式布局
  */
-function changeStyleResponsive(styleResponsive) {
+function changeStyleResponsive (styleResponsive) {
   if (styleResponsive) {
     document.body.classList.remove(BODY_LIMIT_CLASS);
   } else {
@@ -126,7 +127,7 @@ function changeStyleResponsive(styleResponsive) {
 /**
  * 切换色弱模式
  */
-function changeWeakMode(weakMode) {
+function changeWeakMode (weakMode) {
   if (weakMode) {
     document.body.classList.add(WEAK_CLASS);
   } else {
@@ -137,7 +138,7 @@ function changeWeakMode(weakMode) {
 /**
  * 切换主题
  */
-function changeTheme(value, dark) {
+function changeTheme (value, dark) {
   return new Promise((resolve, reject) => {
     try {
       changeColor(value, dark);
@@ -151,7 +152,7 @@ function changeTheme(value, dark) {
 /**
  * 切换布局时禁用过渡动画
  */
-function disableTransition() {
+function disableTransition () {
   disableTransitionTimer && clearTimeout(disableTransitionTimer);
   document.body.classList.add(DISABLES_CLASS);
   disableTransitionTimer = setTimeout(() => {
@@ -173,7 +174,7 @@ export default {
   })(),
   getters: {
     // 需要 keep-alive 的组件
-    keepAliveInclude(state) {
+    keepAliveInclude (state) {
       if (!TAB_KEEP_ALIVE || !state.showTabs) {
         return [];
       }
@@ -202,100 +203,100 @@ export default {
     }
   },
   mutations: {
-    SET(state, { key, value }) {
+    SET (state, { key, value }) {
       state[key] = value;
     }
   },
   actions: {
-    setTabs({ commit }, value) {
+    setTabs ({ commit }, value) {
       commit('SET', { key: 'tabs', value });
       //cacheSetting('tabs', value);
     },
-    setCollapse({ commit, dispatch }, value) {
+    setCollapse ({ commit, dispatch }, value) {
       commit('SET', { key: 'collapse', value });
       dispatch('delayUpdateContentSize', 800);
     },
-    setSideNavCollapse({ commit, dispatch }, value) {
+    setSideNavCollapse ({ commit, dispatch }, value) {
       commit('SET', { key: 'sideNavCollapse', value });
       dispatch('delayUpdateContentSize', 800);
     },
-    setBodyFullscreen({ commit, dispatch }, value) {
+    setBodyFullscreen ({ commit, dispatch }, value) {
       disableTransition();
       commit('SET', { key: 'bodyFullscreen', value });
       dispatch('delayUpdateContentSize', 800);
     },
-    setShowTabs({ commit, dispatch }, value) {
+    setShowTabs ({ commit, dispatch }, value) {
       commit('SET', { key: 'showTabs', value });
       cacheSetting('showTabs', value);
       dispatch('delayUpdateContentSize');
     },
-    setShowFooter({ commit, dispatch }, value) {
+    setShowFooter ({ commit, dispatch }, value) {
       commit('SET', { key: 'showFooter', value });
       cacheSetting('showFooter', value);
       dispatch('delayUpdateContentSize');
     },
-    setHeadStyle({ commit }, value) {
+    setHeadStyle ({ commit }, value) {
       commit('SET', { key: 'headStyle', value });
       cacheSetting('headStyle', value);
     },
-    setSideStyle({ commit }, value) {
+    setSideStyle ({ commit }, value) {
       commit('SET', { key: 'sideStyle', value });
       cacheSetting('sideStyle', value);
     },
-    setLayoutStyle({ commit, dispatch }, value) {
+    setLayoutStyle ({ commit, dispatch }, value) {
       disableTransition();
       commit('SET', { key: 'layoutStyle', value });
       cacheSetting('layoutStyle', value);
       dispatch('delayUpdateContentSize');
     },
-    setSideMenuStyle({ commit, dispatch }, value) {
+    setSideMenuStyle ({ commit, dispatch }, value) {
       disableTransition();
       commit('SET', { key: 'sideMenuStyle', value });
       cacheSetting('sideMenuStyle', value);
       dispatch('delayUpdateContentSize');
     },
-    setTabStyle({ commit }, value) {
+    setTabStyle ({ commit }, value) {
       commit('SET', { key: 'tabStyle', value });
       cacheSetting('tabStyle', value);
     },
-    setTransitionName({ commit }, value) {
+    setTransitionName ({ commit }, value) {
       commit('SET', { key: 'transitionName', value });
       cacheSetting('transitionName', value);
     },
-    setFixedHeader({ commit }, value) {
+    setFixedHeader ({ commit }, value) {
       disableTransition();
       commit('SET', { key: 'fixedHeader', value });
       cacheSetting('fixedHeader', value);
     },
-    setFixedSidebar({ commit }, value) {
+    setFixedSidebar ({ commit }, value) {
       disableTransition();
       commit('SET', { key: 'fixedSidebar', value });
       cacheSetting('fixedSidebar', value);
     },
-    setFixedBody({ commit }, value) {
+    setFixedBody ({ commit }, value) {
       disableTransition();
       commit('SET', { key: 'fixedBody', value });
       cacheSetting('fixedBody', value);
     },
-    setBodyFull({ commit, dispatch }, value) {
+    setBodyFull ({ commit, dispatch }, value) {
       commit('SET', { key: 'bodyFull', value });
       cacheSetting('bodyFull', value);
       dispatch('delayUpdateContentSize');
     },
-    setLogoAutoSize({ commit }, value) {
+    setLogoAutoSize ({ commit }, value) {
       disableTransition();
       commit('SET', { key: 'logoAutoSize', value });
       cacheSetting('logoAutoSize', value);
     },
-    setColorfulIcon({ commit }, value) {
+    setColorfulIcon ({ commit }, value) {
       commit('SET', { key: 'colorfulIcon', value });
       cacheSetting('colorfulIcon', value);
     },
-    setSideUniqueOpen({ commit }, value) {
+    setSideUniqueOpen ({ commit }, value) {
       commit('SET', { key: 'sideUniqueOpen', value });
       cacheSetting('sideUniqueOpen', value);
     },
-    setStyleResponsive({ commit }, value) {
+    setStyleResponsive ({ commit }, value) {
       changeStyleResponsive(value);
       commit('SET', { key: 'styleResponsive', value });
       cacheSetting('styleResponsive', value);
@@ -304,7 +305,7 @@ export default {
      * 切换色弱模式
      * @param value 是否是色弱模式
      */
-    setWeakMode({ commit }, value) {
+    setWeakMode ({ commit }, value) {
       return new Promise((resolve) => {
         changeWeakMode(value);
         commit('SET', { key: 'weakMode', value });
@@ -316,7 +317,7 @@ export default {
      * 切换暗黑模式
      * @param value 是否是暗黑模式
      */
-    setDarkMode({ commit, state }, value) {
+    setDarkMode ({ commit, state }, value) {
       return new Promise((resolve, reject) => {
         changeTheme(state.color, value)
           .then(() => {
@@ -333,7 +334,7 @@ export default {
      * 切换主题色
      * @param value 主题色
      */
-    setColor({ commit, state }, value) {
+    setColor ({ commit, state }, value) {
       return new Promise((resolve, reject) => {
         changeTheme(value, state.darkMode)
           .then(() => {
@@ -350,20 +351,20 @@ export default {
      * 设置主页路由对应的组件名称
      * @param components 组件名称
      */
-    setHomeComponents({ commit }, value) {
+    setHomeComponents ({ commit }, value) {
       commit('SET', { key: 'homeComponents', value });
     },
     /**
      * 设置刷新路由信息
      * @param option 路由刷新参数
      */
-    setRouteReload({ commit }, value) {
+    setRouteReload ({ commit }, value) {
       commit('SET', { key: 'routeReload', value });
     },
     /**
      * 更新屏幕尺寸
      */
-    updateScreenSize({ commit, dispatch }) {
+    updateScreenSize ({ commit, dispatch }) {
       commit('SET', { key: 'screenWidth', value: screenWidth() });
       commit('SET', { key: 'screenHeight', value: screenHeight() });
       dispatch('updateContentSize');
@@ -371,7 +372,7 @@ export default {
     /**
      * 更新内容区域尺寸
      */
-    updateContentSize({ commit }) {
+    updateContentSize ({ commit }) {
       commit('SET', { key: 'contentWidth', value: contentWidth() });
       commit('SET', { key: 'contentHeight', value: contentHeight() });
     },
@@ -379,7 +380,7 @@ export default {
      * 延时更新内容区域尺寸
      * @param delay 延迟时间
      */
-    delayUpdateContentSize({ dispatch }, delay) {
+    delayUpdateContentSize ({ dispatch }, delay) {
       updateContentSizeTimer && clearTimeout(updateContentSizeTimer);
       updateContentSizeTimer = setTimeout(() => {
         dispatch('updateContentSize');
@@ -388,7 +389,7 @@ export default {
     /**
      * 重置设置
      */
-    resetSetting({ commit, state }) {
+    resetSetting ({ commit, state }) {
       return new Promise((resolve, reject) => {
         disableTransition();
         [
@@ -431,7 +432,7 @@ export default {
     /**
      * 恢复主题
      */
-    recoverTheme({ state }) {
+    recoverTheme ({ state }) {
       // 关闭响应式布局
       if (!state.styleResponsive) {
         changeStyleResponsive(false);
@@ -451,7 +452,7 @@ export default {
      * 添加页签或更新相同 key 的页签数据
      * @param data 页签数据
      */
-    tabAdd({ dispatch, state }, data) {
+    tabAdd ({ dispatch, state }, data) {
       if (Array.isArray(data)) {
         data.forEach((d) => {
           dispatch('tabAdd', d);
@@ -475,28 +476,35 @@ export default {
      * 关闭页签
      * @param key 页签 key
      */
-    async tabRemove({ dispatch, state }, { key, active }) {
-      const i = state.tabs.findIndex(
-        (t) => t.key === key || t.fullPath === key
-      );
-      if (i === -1) {
-        return {};
-      }
-      const t = state.tabs[i];
-      if (!t.closable) {
-        return Promise.reject();
+    async tabRemove ({ dispatch, state }, { key, active }) {
+      if (window.__POWERED_BY_QIANKUN__) {
+        return Vue.prototype.$portalStore?.dispatch('theme/tabRemove', {
+          key,
+          active
+        });
+      } else {
+        const i = state.tabs.findIndex(
+          (t) => t.key === key || t.fullPath === key
+        );
+        if (i === -1) {
+          return {};
+        }
+        const t = state.tabs[i];
+        if (!t.closable) {
+          return Promise.reject();
+        }
+        const path = state.tabs[i - 1]?.fullPath;
+        dispatch(
+          'setTabs',
+          state.tabs.filter((_d, j) => j !== i)
+        );
+        return t.key === active ? { path, home: !path } : {};
       }
-      const path = state.tabs[i - 1]?.fullPath;
-      dispatch(
-        'setTabs',
-        state.tabs.filter((_d, j) => j !== i)
-      );
-      return t.key === active ? { path, home: !path } : {};
     },
     /**
      * 关闭左侧页签
      */
-    async tabRemoveLeft({ dispatch, state }, { key, active }) {
+    async tabRemoveLeft ({ dispatch, state }, { key, active }) {
       let index = -1; // 选中页签的 index
       for (let i = 0; i < state.tabs.length; i++) {
         if (state.tabs[i].key === active) {
@@ -520,7 +528,7 @@ export default {
     /**
      * 关闭右侧页签
      */
-    async tabRemoveRight({ dispatch, state }, { key, active }) {
+    async tabRemoveRight ({ dispatch, state }, { key, active }) {
       if (state.tabs.length) {
         let index = -1; // 选中页签的 index
         for (let i = 0; i < state.tabs.length; i++) {
@@ -557,7 +565,7 @@ export default {
     /**
      * 关闭其它页签
      */
-    async tabRemoveOther({ dispatch, state }, { key, active }) {
+    async tabRemoveOther ({ dispatch, state }, { key, active }) {
       let index = -1; // 选中页签的 index
       let path; // 关闭后跳转的 path
       const temp = state.tabs.filter((d, i) => {
@@ -582,7 +590,7 @@ export default {
      * 关闭全部页签
      * @param active 选中页签的 key
      */
-    async tabRemoveAll({ dispatch, state }, active) {
+    async tabRemoveAll ({ dispatch, state }, active) {
       const t = state.tabs.find((d) => d.key === active);
       const home = typeof t !== 'undefined' && t.closable === true; // 是否跳转主页
       const temp = state.tabs.filter((d) => !d.closable);
@@ -596,7 +604,7 @@ export default {
      * 修改页签
      * @param data 页签数据
      */
-    tabSetItem({ dispatch, state }, data) {
+    tabSetItem ({ dispatch, state }, data) {
       let i = -1;
       if (data.key) {
         i = state.tabs.findIndex((d) => d.key === data.key);

+ 22 - 19
src/utils/page-tab-util.js

@@ -6,6 +6,7 @@ import router from '@/router';
 import { Message } from 'element-ui';
 import { removeToken } from '@/utils/token-util';
 import { setDocumentTitle } from '@/utils/document-title-util';
+import { SYSTEM_NAME } from '@/config/setting';
 import {
   HOME_PATH,
   LAYOUT_PATH,
@@ -18,7 +19,7 @@ const BASE_URL = process.env.BASE_URL;
 /**
  * 刷新当前路由
  */
-export function reloadPageTab(option) {
+export function reloadPageTab (option) {
   if (!option) {
     // 刷新当前路由
     const { path, fullPath, query } = router.currentRoute;
@@ -49,7 +50,7 @@ export function reloadPageTab(option) {
 /**
  * 关闭当前页签
  */
-export function finishPageTab() {
+export function finishPageTab () {
   const key = getRouteTabKey();
   removePageTab({ key, active: key });
 }
@@ -59,7 +60,7 @@ export function finishPageTab() {
  * @param key 页签的key
  * @param active 选中页签的key
  */
-export function removePageTab(option) {
+export function removePageTab (option) {
   store
     .dispatch('theme/tabRemove', option)
     .then(({ path, home }) => {
@@ -77,7 +78,7 @@ export function removePageTab(option) {
 /**
  * 关闭左侧页签
  */
-export function removeLeftPageTab(option) {
+export function removeLeftPageTab (option) {
   store
     .dispatch('theme/tabRemoveLeft', option)
     .then(({ path }) => {
@@ -93,7 +94,7 @@ export function removeLeftPageTab(option) {
 /**
  * 关闭右侧页签
  */
-export function removeRightPageTab(option) {
+export function removeRightPageTab (option) {
   store
     .dispatch('theme/tabRemoveRight', option)
     .then(({ path, home }) => {
@@ -111,7 +112,7 @@ export function removeRightPageTab(option) {
 /**
  * 关闭其它页签
  */
-export function removeOtherPageTab(option) {
+export function removeOtherPageTab (option) {
   store
     .dispatch('theme/tabRemoveOther', option)
     .then(({ path, home }) => {
@@ -130,7 +131,7 @@ export function removeOtherPageTab(option) {
  * 关闭全部页签
  * @param active 当前选中页签
  */
-export function removeAllPageTab(active) {
+export function removeAllPageTab (active) {
   store
     .dispatch('theme/tabRemoveAll', active)
     .then(({ home }) => {
@@ -146,7 +147,7 @@ export function removeAllPageTab(active) {
 /**
  * 登录成功后清空页签
  */
-export function cleanPageTabs() {
+export function cleanPageTabs () {
   store.dispatch('theme/setTabs', []);
 }
 
@@ -154,7 +155,7 @@ export function cleanPageTabs() {
  * 添加页签
  * @param data 页签数据
  */
-export function addPageTab(data) {
+export function addPageTab (data) {
   store.dispatch('theme/tabAdd', data);
 }
 
@@ -162,7 +163,7 @@ export function addPageTab(data) {
  * 修改页签
  * @param data 页签数据
  */
-export function setPageTab(data) {
+export function setPageTab (data) {
   store.dispatch('theme/tabSetItem', data);
 }
 
@@ -170,7 +171,7 @@ export function setPageTab(data) {
  * 更新页签数据
  * @param data 页签数据
  */
-export function setPageTabs(data) {
+export function setPageTabs (data) {
   store.dispatch('theme/setTabs', data);
 }
 
@@ -178,7 +179,7 @@ export function setPageTabs(data) {
  * 修改页签标题
  * @param title 标题
  */
-export function setPageTabTitle(title) {
+export function setPageTabTitle (title) {
   setPageTab({ key: getRouteTabKey(), title });
   setDocumentTitle(title);
 }
@@ -186,17 +187,19 @@ export function setPageTabTitle(title) {
 /**
  * 获取当前路由对应的页签 key
  */
-export function getRouteTabKey() {
+export function getRouteTabKey () {
   const { path, fullPath, meta } = router.currentRoute;
   const isUnique = meta.tabUnique === false || REPEATABLE_TABS.includes(path);
-  return isUnique ? fullPath : path;
+  return `${window.__POWERED_BY_QIANKUN__ ? '/page-' + SYSTEM_NAME : ''}${
+    isUnique ? fullPath : path
+  }`;
 }
 
 /**
  * 设置主页的组件名称
  * @param components 组件名称
  */
-export function setHomeComponents(components) {
+export function setHomeComponents (components) {
   store.dispatch('theme/setHomeComponents', components);
 }
 
@@ -204,7 +207,7 @@ export function setHomeComponents(components) {
  * 设置路由刷新信息
  * @param option 路由刷新参数
  */
-export function setRouteReload(option) {
+export function setRouteReload (option) {
   return store.dispatch('theme/setRouteReload', option);
 }
 
@@ -212,7 +215,7 @@ export function setRouteReload(option) {
  * 判断路由是否是主页
  * @param route 路由信息
  */
-export function isHomeRoute(route) {
+export function isHomeRoute (route) {
   const { path, matched } = route;
   if (HOME_ROUTE === path) {
     return true;
@@ -228,7 +231,7 @@ export function isHomeRoute(route) {
  * 登录成功后跳转首页
  * @param from 登录前的地址
  */
-export function goHomeRoute(from) {
+export function goHomeRoute (from) {
   router.replace(from || HOME_ROUTE);
 }
 
@@ -237,7 +240,7 @@ export function goHomeRoute(from) {
  * @param from 是否使用路由跳转
  * @param from 登录后跳转的地址
  */
-export function logout(route, from) {
+export function logout (route, from) {
   removeToken();
   if (route) {
     router.push({

+ 19 - 6
src/views/produceOrder/components/order-dailog.vue

@@ -15,6 +15,7 @@
       ref="table"
       :columns="columns"
       @done="handleDone"
+      @update:selection="selectionChange"
       row-key="id"
       :selection.sync="selectionList"
       :datasource="datasource"
@@ -150,6 +151,20 @@
         return list;
       }
     },
+    watch: {
+      selectionList (newVal, oldVal) {
+        console.log(newVal, oldVal);
+        if (newVal.length < oldVal.length) {
+          const arr = oldVal.filter(
+            (item) => !newVal.find((p) => p.id === item.id)
+          );
+
+          this.memoList = this.memoList.filter(
+            (item) => !arr.find((p) => p.id === item.id)
+          );
+        }
+      }
+    },
     methods: {
       open (val, list = []) {
         this.memoList = list;
@@ -165,6 +180,9 @@
       reload () {
         this.$refs.table.reload();
       },
+      selectionChange (selection) {
+        console.log(selection);
+      },
       /* 表格数据源 */
       datasource ({ page, limit }) {
         return getPage({
@@ -178,12 +196,7 @@
         if (!this.selectionList?.length)
           return this.$message.error('请选择数据');
 
-        this.$emit('success', [
-          ...this.selectionList,
-          ...this.memoList.filter(
-            (item) => !this.selectionList.find((p) => p.id === item.id)
-          )
-        ]);
+        this.$emit('success', [...this.selectionList, ...this.memoList]);
 
         this.cancel();
       },

+ 1 - 2
src/views/produceOrder/index.vue

@@ -59,7 +59,6 @@
               type="primary"
               :underline="false"
               icon="el-icon-truck"
-              v-if="row.status == 2"
               @click="handleOrderPublish(1, row)"
             >
               报工
@@ -325,7 +324,7 @@
       // 发布工单
       handleOrderPublish (type, row) {
         this.$router.push({
-          path: '/productionPlan/workOrderPublish',
+          path: '/produceOrder/report',
           query: {
             type,
             id: row.id

+ 109 - 36
src/views/produceOrder/picking.vue

@@ -3,7 +3,8 @@
     <el-form
       inline
       ref="formRef"
-      :show-error-message="false"
+      :model="{ ...formData, pickOrderList }"
+      :show-message="false"
       class="form-wrapper"
     >
       <el-card>
@@ -17,15 +18,26 @@
         </div>
 
         <header-title title="工单信息">
-          <el-form-item label="执行人工号">
-            <el-input></el-input>
+          <el-form-item label="执行人工号" required prop="executorId">
+            <personSelectRemote
+              v-model="formData.executorId"
+              placeholder="请输入"
+              @selfChange="(val, item) => (formData.executorName = item.name)"
+            />
           </el-form-item>
-          <el-form-item label="执行日期">
-            <el-input></el-input>
+          <el-form-item label="执行日期" prop="executorTime">
+            <el-date-picker
+              v-model="formData.executorTime"
+              value-format="yyyy-MM-dd HH:mm:ss"
+              type="datetime"
+              format="yyyy-MM-dd HH:mm"
+              placeholder="请选择"
+            ></el-date-picker>
           </el-form-item>
         </header-title>
 
         <ele-pro-table
+          :needPage="false"
           :columns="orderColumns"
           :datasource="orderList"
           cache-key="picking-table"
@@ -37,11 +49,11 @@
             <el-link type="danger" @click="delOrder($index)">删除</el-link>
           </template>
         </ele-pro-table>
-        <header-title title="物料信息"> </header-title>
+        <header-title title="物料信息" class="mt-16"> </header-title>
 
         <ele-pro-table
           :columns="materialColumns"
-          :datasource="materialList"
+          :datasource="pickOrderList"
           cache-key="picking-table-material"
         >
           <template v-slot:toolbar>
@@ -50,13 +62,32 @@
           <template v-slot:action="{ $index }">
             <el-link type="danger" @click="delMaterial($index)">删除</el-link>
           </template>
-          <template v-slot:warehouse="{ row }">
-            <el-select v-model="row.w">
-              <el-option>ss</el-option>
-            </el-select>
+          <template v-slot:warehouse="{ row, $index }">
+            <el-form-item
+              label=""
+              :prop="`pickOrderList.${$index}.warehouseId`"
+              required
+            >
+              <DictSelection
+                v-model="row.warehouseId"
+                dict-name="仓库"
+                @itemChange="(item) => (row.warehouse = item.dictValue)"
+              ></DictSelection>
+            </el-form-item>
           </template>
-          <template v-slot:requireNum="{ row }">
-            <el-input v-model="row.c"></el-input>
+          <template v-slot:demandWeight="{ row, $index }">
+            <el-form-item
+              label=""
+              :prop="`pickOrderList.${$index}.demandWeight`"
+              required
+            >
+              <el-input-number
+                class="w100"
+                :controls="false"
+                v-model="row.demandWeight"
+                :min="0"
+              ></el-input-number>
+            </el-form-item>
           </template>
         </ele-pro-table>
       </el-card>
@@ -80,8 +111,12 @@
   import orderDailog from './components/order-dailog';
   import ChooseMaterial from '@/components/material/ChooseMaterial';
   import { batchSave } from '@/api/produceOrder';
+  import DictSelection from '@/components/Dict/DictSelection.vue';
+  import personSelectRemote from '@/components/CommomSelect/person-select-remote';
+  import { getRouteTabKey, removePageTab } from '@/utils/page-tab-util';
   export default {
     components: {
+      personSelectRemote,
       orderDailog,
       ChooseMaterial,
       Extrusion,
@@ -92,12 +127,18 @@
       Package,
       Sinter,
       Furnace,
-      Warehousing
+      Warehousing,
+      DictSelection
     },
     data () {
       return {
         descriptionsShow: true,
         activeName: '1',
+        formData: {
+          executorTime: '',
+          executorName: '',
+          executorId: ''
+        },
         orderColumns: [
           {
             label: '工单号',
@@ -129,14 +170,12 @@
           },
           {
             label: '未成型数量',
-            prop: 'a',
             formatter: (row) => {
               return row.formingNum - row.formedNum;
             }
           },
           {
             label: '未成型重量',
-            prop: 'a',
             formatter: (row) => {
               return row.formingWeight - row.formedWeight;
             }
@@ -155,7 +194,7 @@
           }
         ],
         orderList: [],
-        materialList: [],
+        pickOrderList: [],
         materialColumns: [
           {
             label: '序号',
@@ -164,34 +203,34 @@
           },
           {
             label: '编码',
-            prop: 'a'
+            prop: 'materialCode'
           },
           {
             label: '名称',
-            prop: 'a'
+            prop: 'materialName'
           },
           {
             label: '类型',
-            prop: 'a'
+            prop: 'materialTypeName'
           },
           {
             label: '单位',
-            prop: 'a'
+            prop: 'unit'
           },
           {
             label: '牌号',
-            prop: 'a'
+            prop: 'brandNo'
           },
           {
             label: '型号',
-            prop: 'a'
+            prop: 'model'
           },
           {
             label: '规格',
-            prop: 'a'
+            prop: 'specifications'
           },
           {
-            slot: 'requireNum',
+            slot: 'demandWeight',
             label: '需求数量'
           },
           {
@@ -200,8 +239,7 @@
           },
           {
             slot: 'action',
-            label: '操作',
-            prop: 'a'
+            label: '操作'
           }
         ]
       };
@@ -216,22 +254,45 @@
         this.$refs.orderDailogRef.open(this.orderList.slice(0));
       },
       orderSuccess (list) {
-        this.orderList = list;
-      },
-      materialSuccess (list) {
-        this.orderList = list;
+        const obj = {};
+        this.orderList = [...this.orderList, ...list].reduce((next, pre) => {
+          if (!obj[pre.id]) {
+            obj[pre.id] = true;
+
+            next.push(pre);
+          }
+          return next;
+        }, []);
       },
       addMaterial () {
-        this.$refs.ChooseMaterialRef.open(this.materialList.slice(0));
+        this.$refs.ChooseMaterialRef.open(this.pickOrderList.slice(0));
       },
       materialSuccess (list) {
         const obj = {};
-        this.materialList = [...this.materialList, ...list].reduce(
+        this.pickOrderList = [...this.pickOrderList, ...list].reduce(
           (next, pre) => {
             if (!obj[pre.id]) {
               obj[pre.id] = true;
-              next.push(pre);
+
+              next.push({
+                brandNo: pre.brandNum,
+                // "executorId": pre.brandNo,
+                // "executorName": pre.brandNo,
+                // "executorTime": pre.brandNo,
+                materialCode: pre.code,
+                materialId: pre.id,
+                materialName: pre.name,
+                materialTypeName: pre.categoryLevelGroupName,
+                materialType: +pre.categoryLevelId,
+                model: pre.modelType,
+                specifications: pre.specification,
+                unit: pre.measuringUnit,
+                warehouse: '',
+                warehouseId: '',
+                demandWeight: ''
+              });
             }
+            return next;
           },
           []
         );
@@ -239,7 +300,7 @@
       delMaterial (index) {
         this.$confirm('是否删除', '提示')
           .then(() => {
-            this.materialList.splice(index, 1);
+            this.pickOrderList.splice(index, 1);
           })
           .catch(() => {});
       },
@@ -251,9 +312,21 @@
           .catch(() => {});
       },
       async handleReport () {
+        if (!this.pickOrderList?.length) {
+          return this.$message.error('请添加物料');
+        }
         this.$refs.formRef.validate(async (value) => {
           if (value) {
-            await batchSave();
+            await batchSave({
+              ...this.formData,
+              pickOrderList: this.pickOrderList
+            });
+            this.$message.success('提交成功!');
+            const key = getRouteTabKey();
+            this.$router.push('/produceOrder');
+            removePageTab({ key });
+          } else {
+            this.$message.error('请添完善必填项');
           }
         });
       }

+ 103 - 62
src/views/produceOrder/report.vue

@@ -17,51 +17,69 @@
           border
           v-if="descriptionsShow"
         >
-          <el-descriptions-item label="工单号"
-            >kooriookami</el-descriptions-item
-          >
-          <el-descriptions-item label="生产版本"
-            >18100000000</el-descriptions-item
-          >
-          <el-descriptions-item label="工单类型">苏州市</el-descriptions-item>
-          <el-descriptions-item label="产线">苏州市</el-descriptions-item>
-          <el-descriptions-item label="工艺路线版本"
-            >苏州市</el-descriptions-item
-          >
-          <el-descriptions-item label="计划编号">苏州市</el-descriptions-item>
-          <el-descriptions-item label="计划类型">苏州市</el-descriptions-item>
-          <el-descriptions-item label="产品编码">苏州市</el-descriptions-item>
-          <el-descriptions-item label="产品名称">苏州市</el-descriptions-item>
-          <el-descriptions-item label="牌号 | 型号"
-            >苏州市</el-descriptions-item
-          >
+          <el-descriptions-item label="工单号">{{
+            infoData.code
+          }}</el-descriptions-item>
+          <el-descriptions-item label="生产版本">{{
+            infoData.produceVersionName
+          }}</el-descriptions-item>
+          <el-descriptions-item label="工单类型">{{
+            infoData.workOrderType
+          }}</el-descriptions-item>
+          <el-descriptions-item label="产线">{{
+            infoData.productLine
+          }}</el-descriptions-item>
+          <el-descriptions-item label="工艺路线版本">{{
+            infoData.routingVersion
+          }}</el-descriptions-item>
+          <el-descriptions-item label="计划编号">{{
+            infoData.productionPlanCode
+          }}</el-descriptions-item>
+          <el-descriptions-item label="计划类型">{{
+            infoData.planType
+          }}</el-descriptions-item>
+          <el-descriptions-item label="产品编码">{{
+            infoData.productCode
+          }}</el-descriptions-item>
+          <el-descriptions-item label="产品名称">{{
+            infoData.productName
+          }}</el-descriptions-item>
+          <el-descriptions-item label="牌号 | 型号">{{
+            infoData.code
+          }}</el-descriptions-item>
           <el-descriptions-item label="要求成型数量(PCS)"
-            >苏州市</el-descriptions-item
-          >
-          <el-descriptions-item label="要求成型重量(KG)"
-            >苏州市</el-descriptions-item
-          >
-          <el-descriptions-item label="计划开始时间"
-            >苏州市</el-descriptions-item
-          >
-          <el-descriptions-item label="实际开始时间"
-            >苏州市</el-descriptions-item
-          >
-          <el-descriptions-item label="已成型数量(PCS)"
-            >苏州市</el-descriptions-item
+            >{{ infoData.brandNo }}|{{ infoData.model }}</el-descriptions-item
           >
-          <el-descriptions-item label="已成型重量(KG)"
-            >苏州市</el-descriptions-item
-          >
-          <el-descriptions-item label="已交付数量(PCS)"
-            >苏州市</el-descriptions-item
-          >
-          <el-descriptions-item label="已交付重量(KG)"
-            >苏州市</el-descriptions-item
-          >
-          <el-descriptions-item label="工单状态">苏州市</el-descriptions-item>
-          <el-descriptions-item label="完成时间">苏州市</el-descriptions-item>
-          <el-descriptions-item label="生产周期">苏州市</el-descriptions-item>
+          <el-descriptions-item label="要求成型重量(KG)">{{
+            infoData.formingWeight
+          }}</el-descriptions-item>
+          <el-descriptions-item label="计划开始时间">{{
+            infoData.planStartTime
+          }}</el-descriptions-item>
+          <el-descriptions-item label="实际开始时间">{{
+            infoData.startTime
+          }}</el-descriptions-item>
+          <el-descriptions-item label="已成型数量(PCS)">{{
+            infoData.formedNum
+          }}</el-descriptions-item>
+          <el-descriptions-item label="已成型重量(KG)">{{
+            infoData.formedWeight
+          }}</el-descriptions-item>
+          <el-descriptions-item label="已交付数量(PCS)">{{
+            infoData.deliveredQuantity
+          }}</el-descriptions-item>
+          <el-descriptions-item label="已交付重量(KG)">{{
+            infoData.deliveredWeight
+          }}</el-descriptions-item>
+          <el-descriptions-item label="工单状态">{{
+            infoData.status
+          }}</el-descriptions-item>
+          <el-descriptions-item label="完成时间">{{
+            infoData.completeTime
+          }}</el-descriptions-item>
+          <el-descriptions-item label="生产周期">{{
+            infoData.ssss
+          }}</el-descriptions-item>
         </el-descriptions>
       </el-collapse-transition>
       <div>
@@ -82,15 +100,15 @@
 
     <el-card>
       <el-tabs v-model="activeName" type="card">
-        <el-tab-pane label="挤压成型" name="1"></el-tab-pane>
-        <el-tab-pane label="自然干燥" name="2"></el-tab-pane>
-        <el-tab-pane label="升温干燥" name="3"></el-tab-pane>
-        <el-tab-pane label="半加定长" name="4"></el-tab-pane>
-        <el-tab-pane label="备炉" name="5"></el-tab-pane>
-        <el-tab-pane label="烧结" name="6"></el-tab-pane>
-        <el-tab-pane label="深加工" name="7"></el-tab-pane>
-        <el-tab-pane label="包装" name="8"></el-tab-pane>
-        <el-tab-pane label="入库" name="9"></el-tab-pane>
+        <el-tab-pane label="挤压成型" name="挤压成型"></el-tab-pane>
+        <el-tab-pane label="自然干燥" name="自然干燥"></el-tab-pane>
+        <el-tab-pane label="升温干燥" name="升温干燥"></el-tab-pane>
+        <el-tab-pane label="半加定长" name="半加定长"></el-tab-pane>
+        <el-tab-pane label="备炉" name="备炉"></el-tab-pane>
+        <el-tab-pane label="烧结" name="烧结"></el-tab-pane>
+        <el-tab-pane label="深加工" name="深加工"></el-tab-pane>
+        <el-tab-pane label="包装" name="包装"></el-tab-pane>
+        <el-tab-pane label="入库" name="入库"></el-tab-pane>
       </el-tabs>
       <components :is="componentsList[activeName]"></components>
     </el-card>
@@ -98,6 +116,8 @@
 </template>
 
 <script>
+  import { getById } from '@/api/produceOrder/index.js';
+  import { getProcessByRoute } from '@/api/mianData/index.js';
   import Extrusion from './components/report/Extrusion';
   import Drying from './components/report/Drying';
   import Heating from './components/report/Heating';
@@ -121,20 +141,41 @@
     },
     data () {
       return {
+        infoData: {},
         descriptionsShow: true,
-        activeName: '1',
+        activeName: '挤压成型',
         componentsList: {
-          1: 'Extrusion',
-          2: 'Drying',
-          3: 'Heating',
-          4: 'HalfAdded',
-          5: 'Furnace',
-          6: 'Sinter',
-          7: 'Processing',
-          8: 'Package',
-          9: 'Warehousing'
+          挤压成型: 'Extrusion',
+          自然干燥: 'Drying',
+          升温干燥: 'Heating',
+          半加定长: 'HalfAdded',
+          备炉: 'Furnace',
+          烧结: 'Sinter',
+          深加工: 'Processing',
+          包装: 'Package',
+          入库: 'Warehousing'
         }
       };
+    },
+    created () {
+      this.getDetail(this.$route.query.id);
+    },
+    methods: {
+      async getDetail (id) {
+        const res = await getById(id);
+
+        this.infoData = res;
+      },
+      async getProcess () {
+        const params = {
+          isDetail: false,
+          pageNum: 1,
+          routingId: this.infoData.routingId,
+          size: -1
+        };
+
+        const res = await getProcessByRoute(params);
+      }
     }
   };
 </script>