From 02f85f84ce3d2212736e231c376dd084a7153783 Mon Sep 17 00:00:00 2001
From: 石广澎 <shiguangpeng@163.com>
Date: 星期四, 30 十一月 2023 15:09:15 +0800
Subject: [PATCH] feat: 库存管理 出库管理、采购管理、报废管理 新增时物品查询增加机构限制

---
 admin-web/src/main.js                                              |    3 
 admin-web/src/views/stock/transfer/transferissue/detail.vue        |  225 ++++++---
 admin-web/src/views/stock/transfer/transferApplication/edit.vue    |   62 +-
 admin-web/src/views/stock/scrap/itemScrapping/detail.vue           |    4 
 admin-web/src/views/stock/scrap/itemScrapping/edit.vue             |   56 +
 admin-web/src/styles/store.scss                                    |    2 
 admin-web/src/views/departmentitem/itemdis/distribution/detail.vue |   63 +-
 admin-web/src/views/stock/accessStock/outbound/detail.vue          |   65 ++
 admin-web/src/views/stock/procure/purchaseOrder/edit.vue           |   43 +
 admin-web/src/store/modules/user.js                                |  398 ++++++++--------
 admin-web/src/views/stock/ledger/inventoryAlert/edit.vue           |  173 ++++---
 admin-web/src/views/stock/transfer/transferApplication/detail.vue  |  201 +++++--
 admin-web/src/views/departmentitem/itemdis/distribution/edit.vue   |   58 -
 admin-web/src/views/stock/index.scss                               |    3 
 admin-web/src/utils/base.js                                        |   18 
 admin-web/src/views/departmentitem/itemdis/distribution/index.vue  |    1 
 admin-web/src/views/stock/accessStock/outbound/edit.vue            |   59 +-
 admin-web/src/views/dashboard/index.vue                            |    1 
 18 files changed, 816 insertions(+), 619 deletions(-)

diff --git a/admin-web/src/main.js b/admin-web/src/main.js
index c678513..48cc6fa 100644
--- a/admin-web/src/main.js
+++ b/admin-web/src/main.js
@@ -33,7 +33,7 @@
 import './directive/num';
 import searchInfo from '@/utils/changeColor';
 import exportExcel from '@/utils/exportExcel'; // 瀵煎嚭
-import {downLoad, previewDoc} from '@/utils/base';
+import {downLoad} from '@/utils/base';
 import '@/mock'
 
 Vue.config.devtools = true;
@@ -44,7 +44,6 @@
 });
 
 Vue.prototype.exportExcelUtils = exportExcel;
-Vue.prototype.previewDoc = previewDoc;
 Vue.prototype.downLoad = downLoad;
 Vue.prototype.$searchInfo = searchInfo;
 Vue.use(VueLazyload, {
diff --git a/admin-web/src/store/modules/user.js b/admin-web/src/store/modules/user.js
index 4a42577..5020517 100644
--- a/admin-web/src/store/modules/user.js
+++ b/admin-web/src/store/modules/user.js
@@ -17,223 +17,225 @@
 import {encrypt} from '@/utils/jsencrypt'
 
 const state = {
-  info: getUser(),
-  userInfo:getUserDetail(),//鐢ㄦ埛璇︾粏淇℃伅
-  token: getToken(),
-  userId:'',
-  name: '',
-  avatar: '',
-  introduction: '',
-  roles: [],
-  isLogin: Cookies.get('isLogin'),
-  permissions: [],
-  myButtonPermission:[],
-  captcha: {
-    captchaVerification: '',
-    secretKey: '',
-    token: '',
-  }, //婊戝潡楠岃瘉token
+    info: getUser(),
+    userInfo: getUserDetail(),//鐢ㄦ埛璇︾粏淇℃伅
+    token: getToken(),
+    userId: '',
+    name: '',
+    avatar: '',
+    introduction: '',
+    roles: [],
+    isLogin: Cookies.get('isLogin'),
+    permissions: [],
+    myButtonPermission: [],
+    captcha: {
+        captchaVerification: '',
+        secretKey: '',
+        token: '',
+    }, //婊戝潡楠岃瘉token
 };
 
 const mutations = {
-  SET_USER_INFO:(state, info)=>{
-    // 璁剧疆璇︾粏淇℃伅
-    state.userInfo = info
-    setUserDetail(info)
-  },
-  SET_MYBUTTONPERMISSION: (state, myButtonPermission) => {
-    state.myButtonPermission = myButtonPermission
-  },
-  SET_TOKEN: (state, token) => {
-    state.token = token;
-    setToken(token)
-  },
-  SET_USERINFO: (state, user) =>{
-    // 淇濆瓨鐢ㄦ埛淇℃伅
-    state.info = user
-    setUserInfo(user)
-  },
-  SET_ISLOGIN: (state, isLogin) => {
-    state.isLogin = isLogin;
-    Cookies.set(isLogin);
-  },
-  SET_INTRODUCTION: (state, introduction) => {
-    state.introduction = introduction;
-  },
-  SET_USERID: (state, id) => {
-    state.userId = id;
-  },
-  SET_NAME: (state, name) => {
-    state.name = name;
-  },
-  SET_AVATAR: (state, avatar) => {
-    state.avatar = avatar;
-  },
-  SET_ROLES: (state, roles) => {
-    state.roles = roles;
-  },
-  SET_PERMISSIONS: (state, permissions) => {
-    state.permissions = permissions;
-  },
-  SET_CAPTCHA: (state, captcha) => {
-    state.captcha = captcha;
-  }
+    SET_USER_INFO: (state, info) => {
+        // 璁剧疆璇︾粏淇℃伅
+        state.userInfo = info
+        setUserDetail(info)
+    },
+    SET_MYBUTTONPERMISSION: (state, myButtonPermission) => {
+        state.myButtonPermission = myButtonPermission
+    },
+    SET_TOKEN: (state, token) => {
+        state.token = token;
+        setToken(token)
+    },
+    SET_USERINFO: (state, user) => {
+        // 淇濆瓨鐢ㄦ埛淇℃伅
+        state.info = user
+        setUserInfo(user)
+    },
+    SET_ISLOGIN: (state, isLogin) => {
+        state.isLogin = isLogin;
+        Cookies.set(isLogin);
+    },
+    SET_INTRODUCTION: (state, introduction) => {
+        state.introduction = introduction;
+    },
+    SET_USERID: (state, id) => {
+        state.userId = id;
+    },
+    SET_NAME: (state, name) => {
+        state.name = name;
+    },
+    SET_AVATAR: (state, avatar) => {
+        state.avatar = avatar;
+    },
+    SET_ROLES: (state, roles) => {
+        state.roles = roles;
+    },
+    SET_PERMISSIONS: (state, permissions) => {
+        state.permissions = permissions;
+    },
+    SET_CAPTCHA: (state, captcha) => {
+        state.captcha = captcha;
+    }
 };
 
 const actions = {
-  // user login
-  login({ commit }, userInfo) {
-    // const { account, pwd, key, code, wxCode } = userInfo;
-    const username = userInfo.account.trim()
-    // const password = userInfo.password
-    const password = encrypt(userInfo.password)
-    const code = userInfo.code
-    const uuid = userInfo.uuid
-    const loginType = userInfo.loginType
-    const verifyType = userInfo.verifyType
-    Loading.service();
-    return new Promise((resolve, reject) => {
-      // login(userInfo)
-      login(username, password, code, uuid, loginType, verifyType)
-        .then((data) => {
-          let loadingInstance = Loading.service();
-          loadingInstance.close();
-          commit('SET_TOKEN', data.token);
-          commit('SET_USERINFO', data.userInfo);
-          getCurInfo().then(res=>{
-            commit('SET_USER_INFO',res)
-          })
-          resolve();
-        })
-        .catch((error) => {
-          reject(error);
+    // user login
+    login({commit}, userInfo) {
+        // const { account, pwd, key, code, wxCode } = userInfo;
+        const username = userInfo.account.trim()
+        // const password = userInfo.password
+        const password = encrypt(userInfo.password)
+        const code = userInfo.code
+        const uuid = userInfo.uuid
+        const loginType = userInfo.loginType
+        const verifyType = userInfo.verifyType
+        Loading.service();
+        return new Promise((resolve, reject) => {
+            // login(userInfo)
+            login(username, password, code, uuid, loginType, verifyType)
+                .then((data) => {
+                    let loadingInstance = Loading.service();
+                    loadingInstance.close();
+                    commit('SET_TOKEN', data.token);
+                    commit('SET_USERINFO', data.userInfo);
+                    getCurInfo().then(res => {
+                        commit('SET_USER_INFO', res)
+                        resolve();
+                    }).catch((error) => {
+                        reject(error);
+                    })
+                })
+                .catch((error) => {
+                    reject(error);
+                });
         });
-    });
-  },
+    },
 
-  // 鐭俊鏄惁鐧诲綍
-  isLogin({ commit }, userInfo) {
-    return new Promise((resolve, reject) => {
-      isLoginApi()
-        .then(async (res) => {
-          commit('SET_ISLOGIN', res.isLogin);
-          resolve(res);
-        })
-        .catch((res) => {
-          commit('SET_ISLOGIN', false);
-          reject(res);
+    // 鐭俊鏄惁鐧诲綍
+    isLogin({commit}, userInfo) {
+        return new Promise((resolve, reject) => {
+            isLoginApi()
+                .then(async (res) => {
+                    commit('SET_ISLOGIN', res.isLogin);
+                    resolve(res);
+                })
+                .catch((res) => {
+                    commit('SET_ISLOGIN', false);
+                    reject(res);
+                });
         });
-    });
-  },
+    },
 
-  // get user info
-  getInfo({ commit, state }) {
-    return new Promise((resolve, reject) => {
-      getInfo(state.token)
-        .then(data => {
-          if (!data) {
-            reject('Verification failed, please Login again.');
-          }
-          let roles = data.roleIds;
-          if (!roles || roles.length <= 0) {
-            reject('getInfo: roles must be a non-null array!');
-          }
-          // 鑾峰彇骞惰缃慨鏀瑰瘑鐮佺殑鐘舵��
-          setCPass(data.force_change_pass)
-          if( data.force_change_pass ){
-            router.push({ path: '/resetPwd' });
-            reject(data);
-          }
-          commit('SET_USERID', data.id);
-          commit('SET_ROLES', roles);
-          commit('SET_NAME', data.account);
-          commit('SET_AVATAR', 'http://kaifa.crmeb.net/system/images/admin_logo.png');
-          commit('SET_INTRODUCTION', data.realName);
-          commit('SET_PERMISSIONS', data.permissions); //鏉冮檺鏍囪瘑
-          resolve(data);
-        })
-        .catch((error) => {
-          reject(error);
+    // get user info
+    getInfo({commit, state}) {
+        return new Promise((resolve, reject) => {
+            getInfo(state.token)
+                .then(data => {
+                    if (!data) {
+                        reject('Verification failed, please Login again.');
+                    }
+                    let roles = data.roleIds;
+                    if (!roles || roles.length <= 0) {
+                        reject('getInfo: roles must be a non-null array!');
+                    }
+                    // 鑾峰彇骞惰缃慨鏀瑰瘑鐮佺殑鐘舵��
+                    setCPass(data.force_change_pass)
+                    if (data.force_change_pass) {
+                        router.push({path: '/resetPwd'});
+                        reject(data);
+                    }
+                    commit('SET_USERID', data.id);
+                    commit('SET_ROLES', roles);
+                    commit('SET_NAME', data.account);
+                    commit('SET_AVATAR', 'http://kaifa.crmeb.net/system/images/admin_logo.png');
+                    commit('SET_INTRODUCTION', data.realName);
+                    commit('SET_PERMISSIONS', data.permissions); //鏉冮檺鏍囪瘑
+                    resolve(data);
+                })
+                .catch((error) => {
+                    reject(error);
+                });
         });
-    });
-  },
+    },
 
-  // user logout
-  logout({ commit, state, dispatch }) {
-    Loading.service();
-    return new Promise((resolve, reject) => {
-      logout(state.token)
-        .then(() => {
-          let loadingInstance = Loading.service();
-          loadingInstance.close();
-          commit('SET_TOKEN', '');
-          commit('SET_ROLES', []);
-          commit('SET_PERMISSIONS', []);
-          commit('SET_CONNECTION_CLEAR', null) // 鏂紑閾炬帴
-          removeToken();
-          resetRouter();
-          // localStorage.clear();
-          Cookies.remove('storeStaffList');
-          Cookies.remove('JavaInfo');
-          localStorage.clear('sidebarRouters');
-          sessionStorage.removeItem('token');
-          // reset visited views and cached views
-          // to fixed https://github.com/PanJiaChen/vue-element-admin/issues/2485
-          dispatch('tagsView/delAllViews', null, { root: true });
+    // user logout
+    logout({commit, state, dispatch}) {
+        Loading.service();
+        return new Promise((resolve, reject) => {
+            logout(state.token)
+                .then(() => {
+                    let loadingInstance = Loading.service();
+                    loadingInstance.close();
+                    commit('SET_TOKEN', '');
+                    commit('SET_ROLES', []);
+                    commit('SET_PERMISSIONS', []);
+                    commit('SET_CONNECTION_CLEAR', null) // 鏂紑閾炬帴
+                    removeToken();
+                    resetRouter();
+                    // localStorage.clear();
+                    Cookies.remove('storeStaffList');
+                    Cookies.remove('JavaInfo');
+                    localStorage.clear('sidebarRouters');
+                    sessionStorage.removeItem('token');
+                    // reset visited views and cached views
+                    // to fixed https://github.com/PanJiaChen/vue-element-admin/issues/2485
+                    dispatch('tagsView/delAllViews', null, {root: true});
 
-          resolve();
-        })
-        .catch((error) => {
-          reject(error);
+                    resolve();
+                })
+                .catch((error) => {
+                    reject(error);
+                });
         });
-    });
-  },
+    },
 
-  // remove token
-  resetToken({ commit }) {
-    return new Promise((resolve) => {
-      commit('SET_TOKEN', '');
-      commit('SET_ROLES', []);
-      removeToken();
-      resolve();
-    });
-  },
-  // // 璁剧疆token
-  // setToken({ commit }, state) {
-  //   return new Promise((resolve) => {
-  //     commit('SET_TOKEN', state.token);
-  //     // Cookies.set('JavaInfo', JSON.stringify(state));
-  //     setToken(data.token);
-  //     resolve();
-  //   });
-  // },
+    // remove token
+    resetToken({commit}) {
+        return new Promise((resolve) => {
+            commit('SET_TOKEN', '');
+            commit('SET_ROLES', []);
+            removeToken();
+            resolve();
+        });
+    },
+    // // 璁剧疆token
+    // setToken({ commit }, state) {
+    //   return new Promise((resolve) => {
+    //     commit('SET_TOKEN', state.token);
+    //     // Cookies.set('JavaInfo', JSON.stringify(state));
+    //     setToken(data.token);
+    //     resolve();
+    //   });
+    // },
 
-  // dynamically modify permissions
-  changeRoles({ commit, dispatch }, role) {
-    return new Promise(async (resolve) => {
-      // const token = role + '-token';
-      //
-      // commit('SET_TOKEN', token);
-      // // setToken(token);
-      //
-      const { roles } = await dispatch('getInfo');
-      // resetRouter();
-      // generate accessible routes map based on roles
-      const accessRoutes = await dispatch('permission/generateRoutes', roles, { root: true });
-      // dynamically add accessible routes
-      router.addRoutes(accessRoutes);
+    // dynamically modify permissions
+    changeRoles({commit, dispatch}, role) {
+        return new Promise(async (resolve) => {
+            // const token = role + '-token';
+            //
+            // commit('SET_TOKEN', token);
+            // // setToken(token);
+            //
+            const {roles} = await dispatch('getInfo');
+            // resetRouter();
+            // generate accessible routes map based on roles
+            const accessRoutes = await dispatch('permission/generateRoutes', roles, {root: true});
+            // dynamically add accessible routes
+            router.addRoutes(accessRoutes);
 
-      // reset visited views and cached views
-      dispatch('tagsView/delAllViews', null, { root: true });
+            // reset visited views and cached views
+            dispatch('tagsView/delAllViews', null, {root: true});
 
-      resolve();
-    });
-  },
+            resolve();
+        });
+    },
 };
 
 export default {
-  namespaced: true,
-  state,
-  mutations,
-  actions,
+    namespaced: true,
+    state,
+    mutations,
+    actions,
 };
diff --git a/admin-web/src/styles/store.scss b/admin-web/src/styles/store.scss
index 9cd1dc6..40df8c4 100644
--- a/admin-web/src/styles/store.scss
+++ b/admin-web/src/styles/store.scss
@@ -187,6 +187,8 @@
     cursor: pointer;
     .img {
       width: 100%;
+      height: 100%;
+      object-fit: cover;
     }
   }
 
diff --git a/admin-web/src/utils/base.js b/admin-web/src/utils/base.js
index b2f7f05..74c10b5 100644
--- a/admin-web/src/utils/base.js
+++ b/admin-web/src/utils/base.js
@@ -23,24 +23,6 @@
   return getBaseUrl() + '/pc/fin/file/uploadMore'
 }
 
-// 棰勮鏂囦欢
-export function previewDoc(obj) {
-  const routeUrl = this.$router.resolve({url: '/webOffice/preview'})
-  let url = obj.url
-  const wordLIst = ['doc', 'docm', 'docx', 'docxf', 'dot', 'dotm', 'dotx', 'epub', 'fodt', 'fb2', 'htm', 'html', 'mht', 'odt', 'oform', 'ott', 'oxps', 'pdf', 'rtf', 'txt', 'djvu', 'xml', 'xps', 'csv', 'fods', 'ods', 'ots', 'xls', 'xlsb', 'xlsm', 'xlsx', 'xlt', 'xltm', 'xltx', 'fodp', 'odp', 'otp', 'pot', 'potm', 'potx', 'pps', 'ppsm', 'ppsx', 'ppt', 'pptm', 'pptx']
-  const arr = url.split('.')
-  if (arr.length === 2) {
-    if (wordLIst.includes(arr[arr.length - 1])) {
-      if (obj.url.indexOf('http') !== 0) {
-        url = SettingIplatform.ftpUrl + url
-      }
-      const newWindow = window.open(routeUrl.href + '?url=' + encodeURIComponent(url) + '&docName=' + encodeURIComponent(encodeURIComponent(obj.fileName)), '_blank')
-      if (newWindow) newWindow.opener = null
-    } else {
-      Message.warning('鏂囦欢鏍煎紡涓嶆敮鎸侀瑙堬紒')
-    }
-  }
-}
 
 // 涓嬭浇鏂囦欢
 export function downLoad(obj) {
diff --git a/admin-web/src/views/dashboard/index.vue b/admin-web/src/views/dashboard/index.vue
index 7a12ff2..25a5676 100644
--- a/admin-web/src/views/dashboard/index.vue
+++ b/admin-web/src/views/dashboard/index.vue
@@ -182,6 +182,7 @@
     };
   },
   created() {
+    console.log(this.userInfo)
     this.getAuditList()
     this.getWarningList()
     getGoodsNumPrice().then(res => {
diff --git a/admin-web/src/views/departmentitem/itemdis/distribution/detail.vue b/admin-web/src/views/departmentitem/itemdis/distribution/detail.vue
index 81209db..b5f0479 100644
--- a/admin-web/src/views/departmentitem/itemdis/distribution/detail.vue
+++ b/admin-web/src/views/departmentitem/itemdis/distribution/detail.vue
@@ -1,44 +1,44 @@
 <template>
-  <win-lg class="stock-detail" :title="setting.title" @close="close" :width="'800px'" :loading="loading">
+  <win-md class="stock-detail" :title="setting.title" @close="close" :width="'800px'" :loading="loading">
     <el-row :gutter="20">
       <el-col :span="8">
         <span>鍒嗗彂鍗曞彿锛�</span>
-        <span>{{detail.businessFormCode}}</span>
+        <span>{{ detail.businessFormCode }}</span>
       </el-col>
       <el-col :span="8">
         <span>鎵�灞炴満鏋勶細</span>
-        <span>{{detail.outAgencyName}}</span>
+        <span>{{ detail.outAgencyName }}</span>
       </el-col>
       <el-col :span="8">
         <span>閮ㄩ棬锛�</span>
-        <span>{{detail.inWarehouseName}}</span>
+        <span>{{ detail.inWarehouseName }}</span>
       </el-col>
     </el-row>
     <el-row :gutter="20" style="margin-top: 20px">
       <el-col :span="8">
         <span>鍒嗗彂浜猴細</span>
-        <span>{{detail.outOperatorName}}</span>
+        <span>{{ detail.outOperatorName }}</span>
       </el-col>
       <el-col :span="8">
         <span>鍒嗗彂鏃堕棿锛�</span>
-        <span>{{detail.createTime|formatTime}}</span>
+        <span>{{ detail.createTime|formatTime }}</span>
       </el-col>
       <el-col :span="8">
         <span>棰嗗彇浜猴細</span>
-        <span>{{detail.inOperatorName}}</span>
+        <span>{{ detail.inOperatorName }}</span>
       </el-col>
     </el-row>
     <el-row :gutter="20" style="margin-top: 20px">
       <el-col :span="8">
         <span>鑱旂郴鐢佃瘽锛�</span>
-        <span>{{detail.tel}}</span>
+        <span>{{ detail.tel }}</span>
       </el-col>
     </el-row>
     <el-row :gutter="20" style="margin-top: 20px">
       <el-col class="img-row" :span="24">
         <span>鍒嗗彂鎵嬬画锛�</span>
         <div class="img-box" v-for="(item, index) in fileList" :key="index" @click="handlePreview(item)">
-          <img class="img" :src="getUrl(item.path)" alt="" />
+          <img class="img" :src="getUrl(item.path)" alt=""/>
         </div>
       </el-col>
     </el-row>
@@ -60,13 +60,13 @@
       <el-form>
         <el-row class="card3" v-for="(mItem, mIndex) in goodsItem.models" :key="mIndex">
           <el-col style="padding: 10px 0" :span="10">
-            <el-form-item label="瑙勬牸鍨嬪彿1:"  style="margin-bottom: 0">
+            <el-form-item label="瑙勬牸鍨嬪彿1:" style="margin-bottom: 0">
               {{ mItem.baseGoodsModelsName }}
             </el-form-item>
           </el-col>
           <el-col style="padding: 10px 0" :span="4">
             <el-form-item label="鍗曚綅:" style="margin-bottom: 0" label-width="80">
-              {{mItem.unit}}
+              {{ mItem.unit }}
             </el-form-item>
           </el-col>
           <!--A绫诲晢鍝� -->
@@ -74,17 +74,17 @@
             <el-row v-for="(user, u) in mItem.useInfo" :key="u">
               <el-col :span="6">
                 <el-form-item label="鍒嗗彂鏁伴噺:" style="margin-bottom: 0" label-width="80">
-                  {{user.num}}
+                  {{ user.num }}
                 </el-form-item>
               </el-col>
               <el-col :span="6">
                 <el-form-item label="浣跨敤浜�:" style="margin-bottom: 0" label-width="80">
-                  {{user.name}}
+                  {{ user.name }}
                 </el-form-item>
               </el-col>
               <el-col :span="6">
                 <el-form-item label="鑱旂郴鐢佃瘽:" style="margin-bottom: 0" label-width="80">
-                  {{user.tel}}
+                  {{ user.tel }}
                 </el-form-item>
               </el-col>
             </el-row>
@@ -92,7 +92,7 @@
           <!--BC绫诲晢鍝� -->
           <el-col style="padding: 10px 0" :span="10" v-else>
             <el-form-item label="鍒嗗彂鏁伴噺:" prop="counts" style="margin-bottom: 0" label-width="80">
-              {{mItem.counts}}
+              {{ mItem.counts }}
             </el-form-item>
           </el-col>
         </el-row>
@@ -102,19 +102,19 @@
     <div id="uploadPreviewImages" style="display: none">
       <span v-for="(src, index) in fileList" :key="index">
         <img
-          v-if="checkImg(src.name)"
-          class="v-img"
-          :src="src.url"
-          :alt="src.name"
-          style="width: 100px; height: 100px"
+            v-if="checkImg(src.name)"
+            class="v-img"
+            :src="src.url"
+            :alt="src.name"
+            style="width: 100px; height: 100px"
         />
       </span>
     </div>
-  </win-lg>
+  </win-md>
 </template>
 <script>
 import {transferDetail} from '@/api/stock/transfer';
-import winLg from '@/components/win/win-lg';
+import winMd from '@/components/win/win-md';
 import * as DateFormatter from '@/utils/DateFormatter';
 import {getDownUrl} from '@/utils/base';
 import Viewer from 'viewerjs';
@@ -129,16 +129,17 @@
       return de
     }
   },
-  components: { winLg },
+  components: {winMd},
   props: {
     setting: {
       type: Object,
-      default: () => {},
+      default: () => {
+      },
     },
   },
   data() {
     return {
-      loading:false,
+      loading: true,
       fileList: [],
       detail: {
         baseCategoryName: '',
@@ -165,8 +166,9 @@
     }
   },
   created() {
-    transferDetail({ id: this.setting.id }).then((res) => {
+    transferDetail({id: this.setting.id}).then((res) => {
       this.detail = res;
+      this.loading = false
       this.fileList = this.detail.procureDoc ? JSON.parse(this.detail.procureDoc) : [];
       this.$nextTick(() => {
         this.initPreviewImg();
@@ -226,18 +228,11 @@
 </script>
 <style lang="scss" scoped>
 @import url(../../../../styles/store.scss);
+
 .card3 {
   padding: 10px;
   margin-top: 10px;
   border-radius: 2px;
   background: #ffffff;
-}
-.img-box{
-  width: 100px;
-  height: 100px;
-}
-.img-box .img{
-  width: 100px;
-  height: 100px;
 }
 </style>
diff --git a/admin-web/src/views/departmentitem/itemdis/distribution/edit.vue b/admin-web/src/views/departmentitem/itemdis/distribution/edit.vue
index f84c322..0bf076a 100644
--- a/admin-web/src/views/departmentitem/itemdis/distribution/edit.vue
+++ b/admin-web/src/views/departmentitem/itemdis/distribution/edit.vue
@@ -1,11 +1,11 @@
 <template>
-  <win-md class="stock-edit" title="鐗╁搧鍒嗗彂" @close="close" width="900px">
-    <el-form v-loading="loading" class="form" ref="ruleForm" :model="formData" :rules="rules" label-width="120px">
+  <win-md class="stock-edit" title="鐗╁搧鍒嗗彂" @close="close" width="900px" :loading="loading">
+    <el-form class="form" ref="ruleForm" :model="formData" :rules="rules" label-width="120px">
       <div class="main-w">
         <el-row :gutter="24" class="headerHeight">
           <el-col :span="12">
             <el-form-item label="閮ㄩ棬" prop="departmentId">
-              <el-select ref="department" v-model="formData.departmentId" placeholder="璇烽�夋嫨" style="width: 100%">
+              <el-select ref="department" v-model="formData.departmentId" clearable placeholder="璇烽�夋嫨" style="width: 100%">
                 <el-option v-for="item in departmentOptions" :key="item.id" :label="item.name" :value="item.id"
                            clearable/>
               </el-select>
@@ -75,7 +75,7 @@
               >
                 <el-select
                     v-model="goodsItem.baseGoodsTemplateId"
-                    placeholder="璇烽�夋嫨鐗╁搧"
+                    :placeholder="goodsItem.baseCategoryId?'璇烽�夋嫨鐗╁搧':'璇峰厛閫夋嫨鐗╁搧鍒嗙被'"
                     filterable
                     clearable
                     :disabled="!goodsItem.baseCategoryId"
@@ -97,11 +97,11 @@
               <el-form-item
                   label="瑙勬牸鍨嬪彿"
                   :prop="`transferGoods.${goodsIndex}.modelsIds`"
-                  :rules="{required: true,message: '璇烽�夋嫨',trigger: 'change',}">
+                  :rules="{required: true,message: '璇烽�夋嫨瑙勬牸鍨嬪彿',trigger: 'change',}">
                 <el-select
                     v-model="goodsItem.modelsIds"
                     multiple
-                    placeholder="璇烽�夋嫨鐗╁搧瑙勬牸鍨嬪彿"
+                    :placeholder="goodsItem.baseCategoryId?'璇烽�夋嫨瑙勬牸鍨嬪彿':'璇峰厛閫夋嫨鐗╁搧鍚嶇О'"
                     :disabled="!goodsItem.baseCategoryId"
                     @change="modelChange($event, goodsIndex)"
                     @remove-tag="modelRemoveTag($event, goodsIndex)"
@@ -290,17 +290,7 @@
         }
         callback();
       },
-      loading: false,
-      buyTypeOptions: [
-        {
-          label: '闆嗛噰',
-          value: '1',
-        },
-        {
-          label: '鑷噰',
-          value: '2',
-        },
-      ],
+      loading: true,
       fileList: [],
       departmentOptions: [], // 閮ㄩ棬鍒楄〃
       categoryOptions: [], // 鐗╁搧鍒嗙被鍒楄〃
@@ -342,7 +332,7 @@
         createTime: [{required: true, message: '璇烽�夋嫨鍒嗗彂鏃堕棿', trigger: 'change'}],
         procureDoc: [{required: true, message: '璇蜂笂浼犲鎵规墜缁�', trigger: 'change'}],
         baseCategoryIds: [{required: true, message: '璇烽�夋嫨', trigger: 'change'}],
-        baseGoodsTemplateId: [{validator: checkGoodsTemplateId, trigger: ['blur', 'change']}],
+        baseGoodsTemplateId: [{required: true, message: '璇烽�夋嫨', trigger: 'change'},{validator: checkGoodsTemplateId, trigger: ['blur', 'change']}],
         modelsIds: [{required: true, message: '璇烽�夋嫨', trigger: 'change'}],
         transferGoods: [
           {
@@ -369,7 +359,6 @@
         title: '涓婁紶',
         max: 20, // 鏈�澶уぇ灏忥紝鍗曚綅M
         num: 10, // 鏀寔涓婁紶鍥剧墖涓暟
-        accept: '.jpg,.png', // 闄愬埗鏍煎紡
         tip: '', // 鎻愮ず 榛樿锛歚鍙兘涓婁紶${this.defaultSettings.num}涓�${this.defaultSettings.accept}鏂囦欢锛屼笖涓嶈秴杩�${this.defaultSettings.max}kb`
         uploadUrl: getUploadUrl(), // 涓婁紶璺緞
         multiple: true, // 鏄惁鏀寔鎵归噺涓婁紶
@@ -386,34 +375,13 @@
   },
   methods: {
     async init() {
-      this.getdeptmentList();
-      this.getgoodsTemplate();
-      this.getgoodsModel();
+      await this.getdeptmentList();
       // 鑾峰彇鐗╁搧鍒嗙被鍒楄〃
       const treeRes = await getTree();
       this.categoryOptions = this.removeEmptyChildren(treeRes);
-      /*if (this.setting.id) {
-        const detail = await procureDetail({ id: this.setting.id });
-        this.formData = Object.assign(this.formData, detail);
-        if (this.formData.procureDoc) {
-          this.fileList = JSON.parse(this.formData.procureDoc);
-        }
-        this.$set(this.formData, 'buyType', this.formData.buyType.toString());
-        this.formData.procureTime = this.formData.procureTime.toString();
-        this.formData.transferGoods.map((item, index) => {
-          this.$set(
-            this.formData.transferGoods[index],
-            'modelsIds',
-            item.models.map((v) => v.baseGoodsModelsId),
-          );
-          this.getgoodsTemplate(item.baseCategoryId, index);
-          this.getgoodsModel(item.baseGoodsTemplateId, index);
-          item.models.forEach((child, childIndex) => {
-            this.$set(this.formData.transferGoods[index].models[childIndex], 'priceYuan', child.price / 100);
-          });
-          return item;
-        });
-      }*/
+      this.loading = false
+      this.getgoodsTemplate();
+      this.getgoodsModel();
     },
 
     // 鑾峰彇鍏ュ簱浠撳簱鍒楄〃
@@ -568,7 +536,6 @@
     // 鎻愪氦
     handleSubmit() {
       console.log('formData', this.formData);
-      if(this.loading) return
       this.$refs['ruleForm'].validate((valid) => {
         if (valid) {
           this.formData.transferGoods.map(goods => {
@@ -585,6 +552,7 @@
 
           this.formData.departmentName = this.$refs.department.selected.currentLabel
           this.formData.outAgencyId = this.userInfo.tenantId
+          if(this.loading) return
           this.loading = true
           transferAdd(this.formData)
               .then((res) => {
diff --git a/admin-web/src/views/departmentitem/itemdis/distribution/index.vue b/admin-web/src/views/departmentitem/itemdis/distribution/index.vue
index 8be3bbe..9b4f879 100644
--- a/admin-web/src/views/departmentitem/itemdis/distribution/index.vue
+++ b/admin-web/src/views/departmentitem/itemdis/distribution/index.vue
@@ -172,6 +172,7 @@
         qryType: 1,
         pageNum: this.pageNum,
         pageSize: this.pageSize,
+        outAgencyId: this.userInfo.tenantId,
         ...this.filterFrom,
       }).then((res) => {
         this.list = res.datas;
diff --git a/admin-web/src/views/stock/accessStock/outbound/detail.vue b/admin-web/src/views/stock/accessStock/outbound/detail.vue
index 0f6f7c3..9b49569 100644
--- a/admin-web/src/views/stock/accessStock/outbound/detail.vue
+++ b/admin-web/src/views/stock/accessStock/outbound/detail.vue
@@ -24,10 +24,12 @@
         <span>{{ detail.dealTime | formatTime }}</span>
       </el-col>
     </el-row>
-    <el-row v-if="detail.procureDoc" :gutter="20" style="margin-top: 20px">
+    <el-row v-if="fileList && fileList.length" :gutter="20" style="margin-top: 20px">
       <el-col class="img-row" :span="24">
         <span>鍑哄簱鎵嬬画锛�</span>
-        <div class="img-box"></div>
+        <div class="img-box" v-for="(item, index) in fileList" :key="index" @click="handlePreview(item)">
+          <img class="img" :src="getUrl(item.path)" alt=""/>
+        </div>
       </el-col>
     </el-row>
     <div class="goods-card" v-for="(goodsItem, goodsIndex) in detail.fromOutputGoods" :key="goodsIndex">
@@ -64,6 +66,17 @@
         </el-table-column>
       </el-table>
     </div>
+    <div id="uploadPreviewImages" style="display: none">
+      <span v-for="(src, index) in fileList" :key="index">
+        <img
+            v-if="checkImg(src.name)"
+            class="v-img"
+            :src="src.url"
+            :alt="src.name"
+            style="width: 100px; height: 100px"
+        />
+      </span>
+    </div>
   </win-md>
 </template>
 <script>
@@ -71,6 +84,11 @@
 import winMd from '@/components/win/win-md';
 import * as DateFormatter from '@/utils/DateFormatter';
 
+import {getDownUrl} from "@/utils/base";
+import Viewer from 'viewerjs';
+import 'viewerjs/dist/viewer.css';
+
+let viewer = null;
 export default {
   components: { winMd },
 
@@ -83,6 +101,7 @@
   data() {
     return {
       loading:true,
+      fileList: [],
       detail: {
         categoryName: '',
         businessFormCode: '',
@@ -107,10 +126,50 @@
   created() {
     outputDetail({ id: this.setting.id }).then((res) => {
       this.detail = res;
-      this.loading = false
+      this.fileList = this.detail.doc ? JSON.parse(this.detail.doc) : [];
+      this.loading = false;
+      this.$nextTick(() => {
+        this.initPreviewImg();
+      });
     });
   },
   methods: {
+    initPreviewImg() {
+      if (viewer != null) {
+        viewer.destroy();
+      }
+      const ViewerDom = document.querySelector('#uploadPreviewImages');
+      viewer = new Viewer(ViewerDom, {});
+    },
+    handlePreview(file) {
+      if (!this.checkImg(file.name)) {
+        return false;
+      }
+      let index = 0;
+      for (let i = 0; i < this.fileList.length; i++) {
+        const f = this.fileList[i];
+        if (this.checkImg(f.name)) {
+          if (file.id == f.id) {
+            break;
+          }
+          index++;
+        }
+      }
+      viewer.view(index);
+    },
+    checkImg(name) {
+      const suffix = name.substring(name.lastIndexOf('.'), name.length);
+      const imgArray = ['.jpg', '.jpeg', '.png', '.bmp'];
+      return imgArray.indexOf(suffix) >= 0;
+
+    },
+    getUrl(path) {
+      if (path.substr(0, 7).toLowerCase() == 'http://' || path.substr(0, 8).toLowerCase() == 'https://') {
+        return path;
+      } else {
+        return getDownUrl() + path;
+      }
+    },
     close() {
       this.$emit('close')
     },
diff --git a/admin-web/src/views/stock/accessStock/outbound/edit.vue b/admin-web/src/views/stock/accessStock/outbound/edit.vue
index e7d1cd4..079826e 100644
--- a/admin-web/src/views/stock/accessStock/outbound/edit.vue
+++ b/admin-web/src/views/stock/accessStock/outbound/edit.vue
@@ -5,7 +5,7 @@
         <el-row :gutter="24" class="headerHeight">
           <el-col :span="12">
             <el-form-item label="鍑哄簱浠撳簱" prop="warehouseId">
-              <el-select v-model="formData.warehouseId" placeholder="璇烽�夋嫨" style="width: 100%">
+              <el-select v-model="formData.warehouseId" placeholder="璇烽�夋嫨" clearable style="width: 100%">
                 <el-option
                   v-for="item in warehouseOptions"
                   :key="item.id"
@@ -20,6 +20,7 @@
               <el-date-picker
                 v-model="formData.dealTime"
                 type="datetime"
+                clearable
                 value="yyyy-MM-dd HH:mm:ss"
                 value-format="yyyyMMddHHmmss"
                 placeholder="璇烽�夋嫨鏃ユ湡"
@@ -31,7 +32,7 @@
         </el-row>
         <el-row :gutter="24" class="headerHeight">
           <el-col :span="24">
-            <el-form-item label="鍑哄簱鎵嬬画" prop="procureDoc">
+            <el-form-item label="鍑哄簱鎵嬬画" prop="doc">
               <upload ref="uploadRef" :settings="uploadSettings" @on-change="uploadChange"></upload>
             </el-form-item>
           </el-col>
@@ -41,7 +42,7 @@
             <el-col :span="12">
               <el-form-item
                 label="鐗╁搧鍒嗙被"
-                :prop="`goods[${goodsIndex}].baseCategoryIds`"
+                :prop="`goods.${goodsIndex}.baseCategoryId`"
                 :rules="{
                   required: true,
                   message: '璇烽�夋嫨',
@@ -49,9 +50,13 @@
                 }"
               >
                 <el-cascader
-                  v-model="goodsItem.baseCategoryIds"
+                  v-model="goodsItem.baseCategoryId"
                   :options="categoryOptions"
-                  :props="{ value: 'id' }"
+                  placeholder="璇烽�夋嫨鐗╁搧鍒嗙被"
+                  :props="{ value: 'id',emitPath: false }"
+                  :show-all-levels="false"
+                  filterable
+                  clearable
                   @change="categoryChange($event, goodsIndex)"
                   style="width: 100%"
                 ></el-cascader>
@@ -60,13 +65,14 @@
             <el-col :span="12">
               <el-form-item
                 label="鐗╁搧鍚嶇О"
-                :prop="`goods[${goodsIndex}].baseGoodsTemplateId`"
+                :prop="`goods.${goodsIndex}.baseGoodsTemplateId`"
                 :rules="rules.baseGoodsTemplateId"
               >
                 <el-select
                   v-model="goodsItem.baseGoodsTemplateId"
-                  placeholder="璇峰厛鎷╃墿鍝佸垎绫�"
+                  :placeholder="goodsItem.baseCategoryId?'璇烽�夋嫨鐗╁搧':'璇峰厛閫夋嫨鐗╁搧鍒嗙被'"
                   filterable
+                  clearable
                   :disabled="!goodsItem.baseCategoryId"
                   style="width: 100%"
                   @change="goodsTemplateChange($event, goodsIndex)"
@@ -85,20 +91,22 @@
             <el-col :span="12">
               <el-form-item
                 label="瑙勬牸鍨嬪彿"
-                :prop="`goods[${goodsIndex}].modelsIds`"
+                :prop="`goods.${goodsIndex}.modelsIds`"
                 :rules="{
                   required: true,
-                  message: '璇烽�夋嫨',
+                  message: '璇烽�夋嫨瑙勬牸鍨嬪彿',
                   trigger: 'change',
                 }"
               >
                 <el-select
                   v-model="goodsItem.modelsIds"
                   multiple
-                  placeholder="璇峰厛鎷╃墿鍝佸悕绉�"
+                  clearable
+                  :placeholder="goodsItem.baseCategoryId?'璇烽�夋嫨瑙勬牸鍨嬪彿':'璇峰厛閫夋嫨鐗╁搧鍚嶇О'"
                   :disabled="!goodsItem.baseCategoryId"
                   @change="modelChange($event, goodsIndex)"
                   @remove-tag="modelRemoveTag($event, goodsIndex)"
+                  @clear="modelRemoveTag(-1, goodsIndex)"
                   style="width: 100%"
                 >
                   <el-option
@@ -131,8 +139,7 @@
               <template slot-scope="scope">
                 <el-form-item
                   label-width="0"
-                  style="margin-bottom: 0"
-                  :prop="`goods[${goodsIndex}].models[${scope.$index}].counts`"
+                  :prop="`goods.${goodsIndex}.models.${scope.$index}.counts`"
                   :rules="rules.counts"
                 >
                   <el-input
@@ -213,7 +220,7 @@
       formData: {
         warehouseId: '', // 鍑哄簱浠撳簱id
         dealTime: '', // 鍑哄簱鏃堕棿
-        procureDoc: '',
+        doc: '',
         goods: [],
       },
       goodsItem: {
@@ -233,13 +240,12 @@
         unit: null, //鍗曚綅
       },
       rules: {
-        warehouseId: [{ required: true, message: '璇烽�夋嫨', trigger: 'change' }],
-        dealTime: [{ required: true, message: '璇烽�夋嫨', trigger: 'change' }],
-        buyType: [{ required: true, message: '璇烽�夋嫨', trigger: 'change' }],
-
-        baseCategoryIds: [{ required: true, message: '璇烽�夋嫨', trigger: 'change' }],
-        baseGoodsTemplateId: [{ validator: checkGoodsTemplateId, trigger: ['blur', 'change'] }],
-        modelsIds: [{ required: true, message: '璇烽�夋嫨', trigger: 'change' }],
+        warehouseId: [{ required: true, message: '璇烽�夋嫨浠撳簱', trigger: 'change' }],
+        dealTime: [{ required: true, message: '璇烽�夋嫨鏃堕棿', trigger: 'change' }],
+        doc: [{required: true, message: '璇蜂笂浼犲鎵规墜缁�', trigger: 'change'}],
+        baseCategoryId: [{ required: true, message: '璇烽�夋嫨鐗╁搧鍒嗙被', trigger: 'change' }],
+        baseGoodsTemplateId: [{ required: true, message: '璇烽�夋嫨鐗╁搧', trigger: 'change' },{ validator: checkGoodsTemplateId, trigger: ['blur', 'change'] }],
+        modelsIds: [{ required: true, message: '璇烽�夋嫨瑙勬牸鍨嬪彿', trigger: 'change' }],
         counts: [{ required: true, message: '璇疯緭鍏�', trigger: 'change' }],
       },
 
@@ -247,7 +253,6 @@
         title: '涓婁紶',
         max: 20, // 鏈�澶уぇ灏忥紝鍗曚綅M
         num: 10, // 鏀寔涓婁紶鍥剧墖涓暟
-        accept: '.jpg,.png', // 闄愬埗鏍煎紡
         tip: '', // 鎻愮ず 榛樿锛歚鍙兘涓婁紶${this.defaultSettings.num}涓�${this.defaultSettings.accept}鏂囦欢锛屼笖涓嶈秴杩�${this.defaultSettings.max}kb`
         uploadUrl: getUploadUrl(), // 涓婁紶璺緞
         multiple: true, // 鏄惁鏀寔鎵归噺涓婁紶
@@ -304,7 +309,7 @@
 
     // 鑾峰彇鐗╁搧鍚嶇О鍒楄〃
     async getgoodsTemplate(id, index) {
-      await goodsTemplate({ categoryId: id || '' }).then((res) => {
+      await goodsTemplate({ agencyId: this.userInfo.tenantId, categoryId: id || '' }).then((res) => {
         if (index || index == 0) {
           this.$set(this.formData.goods[index], 'goodsOptions', res);
         } else {
@@ -350,10 +355,8 @@
       this.formData.goods[index].modelsOptions = [];
       this.formData.goods[index].modelsIds = [];
       this.formData.goods[index].models = [];
-
-      this.formData.goods[index].baseCategoryId = e[e.length - 1];
       // 鏍规嵁閫変腑鍒嗙被璇锋眰鐗╁搧鍚嶇О鍒楄〃
-      this.getgoodsTemplate(e[e.length - 1], index);
+      this.getgoodsTemplate(e, index);
     },
 
     // 鐗╁搧鍚嶇О鍒楄〃閫夋嫨
@@ -390,6 +393,10 @@
 
     // 瑙勬牸鍨嬪彿绉婚櫎
     modelRemoveTag(e, index) {
+      if(e===-1){
+        this.formData.goods[index].models = []
+        return
+      }
       let arr = this.formData.goods[index].models;
       let delIndex = arr.findIndex((v) => v.baseGoodsModelsId == e);
       this.formData.goods[index].models.splice(delIndex, 1);
@@ -398,7 +405,7 @@
     // 涓婁紶
     uploadChange() {
       let arr = this.$refs.uploadRef.fileList;
-      this.formData.procureDoc = JSON.stringify(arr);
+      this.formData.doc = JSON.stringify(arr);
     },
 
     // 鐐瑰嚮鏂板鐗╁搧
diff --git a/admin-web/src/views/stock/index.scss b/admin-web/src/views/stock/index.scss
index 9cd1dc6..324f67b 100644
--- a/admin-web/src/views/stock/index.scss
+++ b/admin-web/src/views/stock/index.scss
@@ -187,12 +187,13 @@
     cursor: pointer;
     .img {
       width: 100%;
+      height: 100%;
+      object-fit: cover;
     }
   }
 
   .goods-card {
     position: relative;
-    background: #f6f6f6;
     padding: 20px;
     box-sizing: border-box;
     border-radius: 4px;
diff --git a/admin-web/src/views/stock/ledger/inventoryAlert/edit.vue b/admin-web/src/views/stock/ledger/inventoryAlert/edit.vue
index 37e396f..acbd321 100644
--- a/admin-web/src/views/stock/ledger/inventoryAlert/edit.vue
+++ b/admin-web/src/views/stock/ledger/inventoryAlert/edit.vue
@@ -1,28 +1,31 @@
 <template>
-  <win-md :title="`${setting.title}棰勮璁剧疆`" @close="close" :width="'800px'">
+  <win-md :title="`${setting.title}棰勮璁剧疆`" @close="close" :width="'800px'" :loading="loading">
     <el-form ref="ruleForm" :model="formData" :rules="rules" class="demo-ruleForm" label-width="100px">
       <el-row :gutter="24">
         <el-col :span="12">
-          <el-form-item label="鍏ュ簱浠撳簱" prop="baseWarehouseId">
+          <el-form-item label="棰勮浠撳簱" prop="baseWarehouseId">
             <el-select
-              v-model="formData.baseWarehouseId"
-              placeholder="璇烽�夋嫨"
-              style="width: 100%"
-              :disabled="type == 'edit'"
+                v-model="formData.baseWarehouseId"
+                placeholder="璇烽�夋嫨棰勮浠撳簱"
+                style="width: 100%"
+                :disabled="type == 'edit'"
             >
-              <el-option v-for="item in warehouses" :key="item.id" :label="item.warehouseName" :value="item.id" />
+              <el-option v-for="item in warehouses" :key="item.id" :label="item.warehouseName" :value="item.id"/>
             </el-select>
           </el-form-item>
         </el-col>
         <el-col :span="12">
-          <el-form-item label="鐗╁搧鍒嗙被" prop="baseCategoryIds">
+          <el-form-item label="鐗╁搧鍒嗙被" prop="baseCategoryId">
             <el-cascader
-              v-model="formData.baseCategoryIds"
-              :options="categoryOptions"
-              :props="{ value: 'id' }"
-              @change="categoryChange"
-              style="width: 100%"
-              :disabled="type == 'edit'"
+                v-model="formData.baseCategoryId"
+                :options="categoryOptions"
+                :props="{ value: 'id',emitPath: false }"
+                :show-all-levels="false"
+                filterable
+                clearable
+                @change="categoryChange"
+                style="width: 100%"
+                :disabled="type == 'edit'"
             ></el-cascader>
           </el-form-item>
         </el-col>
@@ -31,18 +34,19 @@
         <el-col :span="12">
           <el-form-item label="鐗╁搧鍚嶇О" prop="baseGoodsTemplateId">
             <el-select
-              :value="formData.baseGoodsTemplateId"
-              placeholder="璇峰厛鎷╃墿鍝佸垎绫�"
-              filterable
-              :disabled="!formData.baseCategoryId || type == 'edit'"
-              @change="goodsTemplateChange"
-              style="width: 100%"
+                :value="formData.baseGoodsTemplateId"
+                :placeholder="formData.baseCategoryId?'璇烽�夋嫨鐗╁搧':'璇峰厛閫夋嫨鐗╁搧鍒嗙被'"
+                filterable
+                clearable
+                :disabled="!formData.baseCategoryId || type == 'edit'"
+                @change="goodsTemplateChange"
+                style="width: 100%"
             >
               <el-option
-                v-for="item in goodsTemplatelOptions"
-                :key="item.id"
-                :label="item.goodsName"
-                :value="item.id"
+                  v-for="item in goodsTemplatelOptions"
+                  :key="item.id"
+                  :label="item.goodsName"
+                  :value="item.id"
               />
             </el-select>
           </el-form-item>
@@ -50,15 +54,17 @@
         <el-col :span="12">
           <el-form-item label="瑙勬牸鍨嬪彿" prop="modelsIds">
             <el-select
-              v-model="formData.modelsIds"
-              multiple
-              :disabled="!formData.baseGoodsTemplateId || type == 'edit'"
-              placeholder="璇峰厛鎷╃墿鍝佸悕绉�"
-              @change="modelChange"
-              @remove-tag="modelRemoveTag"
-              style="width: 100%"
+                v-model="formData.modelsIds"
+                multiple
+                clearable
+                :disabled="!formData.baseGoodsTemplateId || type == 'edit'"
+                :placeholder="formData.baseCategoryId?'璇烽�夋嫨瑙勬牸鍨嬪彿':'璇峰厛閫夋嫨鐗╁搧鍚嶇О'"
+                @change="modelChange"
+                @remove-tag="modelRemoveTag"
+                @clear="modelRemoveTag(-1)"
+                style="width: 100%"
             >
-              <el-option v-for="item in modelsOptions" :key="item.id" :label="item.modelName" :value="item.id" />
+              <el-option v-for="item in modelsOptions" :key="item.id" :label="item.modelName" :value="item.id"/>
             </el-select>
           </el-form-item>
         </el-col>
@@ -84,10 +90,10 @@
         <el-table-column prop="lowerLimit" label="淇濆簳搴撳瓨" align="center">
           <template slot-scope="scope">
             <el-form-item
-              v-if="scope.row.lowerLimit || scope.row.upperLimit"
-              label-width="0"
-              :prop="`models[${scope.$index}].lowerLimit`"
-              :rules="rules.lowerLimit"
+                v-if="scope.row.lowerLimit || scope.row.upperLimit"
+                label-width="0"
+                :prop="`models[${scope.$index}].lowerLimit`"
+                :rules="rules.lowerLimit"
             >
               <el-input v-model.number="scope.row.lowerLimit"></el-input>
             </el-form-item>
@@ -97,10 +103,10 @@
         <el-table-column prop="upperLimit" label="灏侀《搴撳瓨" align="center">
           <template slot-scope="scope">
             <el-form-item
-              v-if="scope.row.lowerLimit || scope.row.upperLimit"
-              label-width="0"
-              :prop="`models[${scope.$index}].upperLimit`"
-              :rules="rules.upperLimit"
+                v-if="scope.row.lowerLimit || scope.row.upperLimit"
+                label-width="0"
+                :prop="`models[${scope.$index}].upperLimit`"
+                :rules="rules.upperLimit"
             >
               <el-input v-model.number="scope.row.upperLimit"></el-input>
             </el-form-item>
@@ -110,8 +116,8 @@
       </el-table>
     </el-form>
     <div slot="footer" align="center" class="dialog-footer">
-      <my-button name="鍙栨秷" site="form" @click="close" />
-      <my-button name="淇濆瓨" site="form" @click="save" />
+      <my-button name="鍙栨秷" site="form" @click="close"/>
+      <my-button name="淇濆瓨" site="form" @click="save"/>
     </div>
   </win-md>
 </template>
@@ -131,15 +137,17 @@
 import {findParentIds} from '@/utils/index';
 
 export default {
-  components: { winMd, myButton },
+  components: {winMd, myButton},
   props: {
     setting: {
       type: Object,
-      default: () => {},
+      default: () => {
+      },
     },
   },
   data() {
     return {
+      loading: true,
       type: '',
       warehouses: [], // 鍏ュ簱浠撳簱鍒楄〃
       agencyOptions: [], // 璋冩嫧鏈烘瀯
@@ -156,16 +164,17 @@
         models: [],
       },
       rules: {
-        baseCategoryIds: [{ required: true, message: '璇烽�夋嫨', trigger: 'blur' }],
-        baseGoodsTemplateId: [{ required: true, message: '璇烽�夋嫨', trigger: 'blur' }],
-        modelsIds: [{ required: true, message: '璇烽�夋嫨', trigger: 'blur' }],
+        baseWarehouseId: [{required: true, message: '璇烽�夋嫨棰勮浠撳簱', trigger: 'change'}],
+        baseCategoryId: [{required: true, message: '璇烽�夋嫨鐗╁搧鍒嗙被', trigger: 'change'}],
+        baseGoodsTemplateId: [{required: true, message: '璇烽�夋嫨鐗╁搧', trigger: 'change'}],
+        modelsIds: [{required: true, message: '璇烽�夋嫨瑙勬牸鍨嬪彿', trigger: 'change'}],
         lowerLimit: [
-          { required: true, message: '璇疯緭鍏�', trigger: 'blur' },
-          { type: 'number', message: '璇疯緭鍏ユ暟瀛楀��', trigger: 'blur' },
+          {required: true, message: '璇疯緭鍏�', trigger: 'blur'},
+          {type: 'number', message: '璇疯緭鍏ユ暟瀛楀��', trigger: 'blur'},
         ],
         upperLimit: [
-          { required: true, message: '璇疯緭鍏�', trigger: 'blur' },
-          { type: 'number', message: '璇疯緭鍏ユ暟瀛楀��', trigger: 'blur' },
+          {required: true, message: '璇疯緭鍏�', trigger: 'blur'},
+          {type: 'number', message: '璇疯緭鍏ユ暟瀛楀��', trigger: 'blur'},
         ],
       },
     };
@@ -178,13 +187,14 @@
   },
   methods: {
     async init() {
+      await this.getWarehouseList();
+      await this.getCategoryTree();
       if (this.setting.id) {
         this.type = 'edit';
-        const detail = await warningConfigGetById({ id: this.setting.id });
-        await this.getCategoryTree();
+        const detail = await warningConfigGetById({id: this.setting.id});
         this.formData = Object.assign({}, detail);
         // 鍒嗙被鍙嶆樉
-        let res = await queryGoodsModelInfo({ baseGoodsModelsId: this.formData.baseGoodsModelsId });
+        let res = await queryGoodsModelInfo({baseGoodsModelsId: this.formData.baseGoodsModelsId});
         this.formData.baseCategoryId = res[0].categoryId;
         this.formData.baseCategoryIds = findParentIds(this.categoryOptions, this.formData.baseCategoryId);
         // 鐗╁搧鍚嶇О鍙嶆樉
@@ -193,24 +203,22 @@
         this.getgoodsModel(this.formData.baseGoodsTemplateId);
         this.formData.modelsIds = [this.formData.baseGoodsModelsId];
         this.getWarehouseList();
-      } else {
-        this.getWarehouseList();
-        this.getCategoryTree();
       }
+      this.loading = false
     },
     // 鑾峰彇鍏ュ簱浠撳簱鍒楄〃
     getWarehouseList() {
-      selectTenantWarehouse({ agencyId: this.userInfo.tenantId })
-        .then((res) => {
-          this.warehouses = res;
-          if (this.warehouses.length && !this.formData.baseWarehouseId) {
-            // 榛樿閫変腑绗竴涓粨搴�
-            this.formData.baseWarehouseId = this.warehouses[0].id;
-          }
-        })
-        .catch((err) => {
-          console.log('err', err);
-        });
+      selectTenantWarehouse({agencyId: this.userInfo.tenantId})
+          .then((res) => {
+            this.warehouses = res;
+            if (this.warehouses.length && !this.formData.baseWarehouseId) {
+              // 榛樿閫変腑绗竴涓粨搴�
+              this.formData.baseWarehouseId = this.warehouses[0].id;
+            }
+          })
+          .catch((err) => {
+            console.log('err', err);
+          });
     },
 
     getCategoryTree() {
@@ -224,14 +232,14 @@
 
     // 鑾峰彇鐗╁搧鍚嶇О鍒楄〃
     getgoodsTemplate(id) {
-      goodsTemplate({ categoryId: id || '', agencyId: this.userInfo.tenantId }).then((res) => {
+      goodsTemplate({categoryId: id || '', agencyId: this.userInfo.tenantId}).then((res) => {
         this.goodsTemplatelOptions = res;
       });
     },
 
     // 瑙勬牸鍨嬪彿
     getgoodsModel(id) {
-      goodsModel({ goodsTemplatesId: id || '' }).then((res) => {
+      goodsModel({goodsTemplatesId: id || ''}).then((res) => {
         this.modelsOptions = res;
       });
     },
@@ -247,23 +255,19 @@
 
     // 鐗╁搧鍒嗙被閫夋嫨
     categoryChange(e) {
-      if (!e) return;
       this.goodsTemplatelOptions = [];
       this.modelsOptions = [];
       this.formData.baseGoodsTemplateId = '';
       this.formData.modelsIds = [];
       this.formData.models = [];
-
-      this.formData.baseCategoryId = e[e.length - 1];
       // 鏍规嵁閫変腑鍒嗙被璇锋眰鐗╁搧鍚嶇О鍒楄〃
-      this.getgoodsTemplate(this.formData.baseCategoryId);
+      this.getgoodsTemplate(e);
     },
 
     // 鐗╁搧鍚嶇О鍒楄〃閫夋嫨
     goodsTemplateChange(e) {
       this.formData.modelsIds = [];
       this.formData.models = [];
-
       this.formData.baseGoodsTemplateId = e;
       // 鏍规嵁閫変腑鐗╁搧鍚嶇Оid鑾峰彇瑙勬牸鍨嬪彿鍒楄〃
       this.getgoodsModel(e);
@@ -286,24 +290,31 @@
       let str = JSON.stringify(arr);
       e.forEach((item, index) => {
         if (str && !str.includes(item)) {
-          arr.push({ baseGoodsModelsId: item, lowerLimit: null, upperLimit: null });
+          arr.push({baseGoodsModelsId: item, lowerLimit: null, upperLimit: null});
         }
       });
     },
 
     // 瑙勬牸鍨嬪彿绉婚櫎
     modelRemoveTag(e) {
+      if (e === -1) {
+        this.formData.models = []
+        return
+      }
       let delIndex = this.formData.models.findIndex((v) => v.baseGoodsModelsId == e);
       this.formData.models.splice(delIndex, 1);
     },
 
-    getEditInfo(id) {},
+    getEditInfo(id) {
+    },
     close() {
       this.$emit('close');
     },
     save() {
       this.$refs.ruleForm.validate((valid) => {
         if (valid) {
+          if (this.loading) return
+          this.loading = true;
           if (this.setting.id) {
             // 缂栬緫鎺ュ彛
             const params = {
@@ -312,9 +323,13 @@
               upperLimit: this.formData.upperLimit,
             };
             warningConfigUpd(params).then((res) => {
+              this.loading = false;
               this.$message.success('淇濆瓨鎴愬姛锛�');
               this.close();
               this.$emit('search');
+            }).catch((err) => {
+              this.loading = false;
+              this.$message.error('淇濆瓨澶辫触');
             });
           } else {
             const params = {
@@ -324,9 +339,13 @@
               modelConfigStr: JSON.stringify(this.formData.models),
             };
             warningConfigAdd(params).then((res) => {
+              this.loading = false;
               this.$message.success('淇濆瓨鎴愬姛锛�');
               this.close();
               this.$emit('search');
+            }).catch((err) => {
+              this.loading = false;
+              this.$message.error('淇濆瓨澶辫触');
             });
           }
         } else {
diff --git a/admin-web/src/views/stock/procure/purchaseOrder/edit.vue b/admin-web/src/views/stock/procure/purchaseOrder/edit.vue
index e1482dc..b934681 100644
--- a/admin-web/src/views/stock/procure/purchaseOrder/edit.vue
+++ b/admin-web/src/views/stock/procure/purchaseOrder/edit.vue
@@ -5,7 +5,7 @@
         <el-row :gutter="24" class="headerHeight">
           <el-col :span="12">
             <el-form-item label="鍏ュ簱浠撳簱" prop="warehouseId">
-              <el-select v-model="formData.warehouseId" placeholder="璇烽�夋嫨" style="width: 100%">
+              <el-select v-model="formData.warehouseId" placeholder="璇烽�夋嫨" clearable style="width: 100%">
                 <el-option v-for="item in warehouses" :key="item.id" :label="item.warehouseName" :value="item.id"/>
               </el-select>
             </el-form-item>
@@ -15,6 +15,7 @@
               <el-date-picker
                   v-model="formData.procureTime"
                   type="datetime"
+                  clearable
                   value="yyyy-MM-dd HH:mm:ss"
                   value-format="yyyyMMddHHmmss"
                   placeholder="璇烽�夋嫨鏃ユ湡"
@@ -45,17 +46,20 @@
             <el-col :span="12">
               <el-form-item
                   label="鐗╁搧鍒嗙被"
-                  :prop="`procureGoods[${goodsIndex}].baseCategoryIds`"
+                  :prop="`procureGoods.${goodsIndex}.baseCategoryId`"
                   :rules="{
                   required: true,
-                  message: '璇烽�夋嫨',
+                  message: '璇烽�夋嫨鐗╁搧鍒嗙被',
                   trigger: 'change',
                 }"
               >
                 <el-cascader
-                    v-model="goodsItem.baseCategoryIds"
+                    v-model="goodsItem.baseCategoryId"
                     :options="categoryOptions"
-                    :props="{ value: 'id' }"
+                    :props="{ value: 'id',emitPath: false }"
+                    :show-all-levels="false"
+                    filterable
+                    clearable
                     @change="categoryChange($event, goodsIndex)"
                     style="width: 100%"
                 ></el-cascader>
@@ -64,13 +68,14 @@
             <el-col :span="12">
               <el-form-item
                   label="鐗╁搧鍚嶇О"
-                  :prop="`procureGoods[${goodsIndex}].baseGoodsTemplateId`"
+                  :prop="`procureGoods.${goodsIndex}.baseGoodsTemplateId`"
                   :rules="rules.baseGoodsTemplateId"
               >
                 <el-select
                     v-model="goodsItem.baseGoodsTemplateId"
-                    placeholder="璇峰厛鎷╃墿鍝佸垎绫�"
+                    :placeholder="goodsItem.baseCategoryId?'璇烽�夋嫨鐗╁搧':'璇峰厛閫夋嫨鐗╁搧鍒嗙被'"
                     filterable
+                    clearable
                     :disabled="!goodsItem.baseCategoryId"
                     style="width: 100%"
                     @change="goodsTemplateChange($event, goodsIndex)"
@@ -89,20 +94,22 @@
             <el-col :span="12">
               <el-form-item
                   label="瑙勬牸鍨嬪彿"
-                  :prop="`procureGoods[${goodsIndex}].modelsIds`"
+                  :prop="`procureGoods.${goodsIndex}.modelsIds`"
                   :rules="{
                   required: true,
-                  message: '璇烽�夋嫨',
+                  message: '璇烽�夋嫨瑙勬牸鍨嬪彿',
                   trigger: 'change',
                 }"
               >
                 <el-select
                     v-model="goodsItem.modelsIds"
                     multiple
-                    placeholder="璇峰厛鎷╃墿鍝佸悕绉�"
+                    clearable
+                    :placeholder="goodsItem.baseCategoryId?'璇烽�夋嫨瑙勬牸鍨嬪彿':'璇峰厛閫夋嫨鐗╁搧鍚嶇О'"
                     :disabled="!goodsItem.baseCategoryId"
                     @change="modelChange($event, goodsIndex)"
                     @remove-tag="modelRemoveTag($event, goodsIndex)"
+                    @clear="modelRemoveTag(-1, goodsIndex)"
                     style="width: 100%"
                 >
                   <el-option
@@ -305,7 +312,7 @@
 
         procureDoc: [{required: true, message: '璇蜂笂浼�', trigger: 'change'}],
         baseCategoryIds: [{required: true, message: '璇烽�夋嫨', trigger: 'change'}],
-        baseGoodsTemplateId: [{validator: checkGoodsTemplateId, trigger: ['blur', 'change']}],
+        baseGoodsTemplateId: [{required: true, message: '璇烽�夋嫨', trigger: 'change'},{validator: checkGoodsTemplateId, trigger: ['blur', 'change']}],
         modelsIds: [{required: true, message: '璇烽�夋嫨', trigger: 'change'}],
         priceYuan: [{validator: checkPrice, trigger: 'blur'}],
         counts: [{validator: checkCounts, trigger: 'blur'}],
@@ -332,6 +339,8 @@
   methods: {
     async init() {
       await this.getWarehouseList();
+      await this.getgoodsTemplate();
+      await this.getgoodsModel();
 
       // 鑾峰彇鐗╁搧鍒嗙被鍒楄〃
       const treeRes = await getTree();
@@ -359,9 +368,6 @@
           });
           return item;
         });
-      } else {
-        await this.getgoodsTemplate();
-        await this.getgoodsModel();
       }
       this.loading = false;
     },
@@ -397,7 +403,7 @@
 
     // 鑾峰彇鐗╁搧鍚嶇О鍒楄〃
     async getgoodsTemplate(id, index) {
-      await goodsTemplate({categoryId: id || ''}).then((res) => {
+      await goodsTemplate({agencyId: this.userInfo.tenantId, categoryId: id || ''}).then((res) => {
         if (index || index == 0) {
           this.$set(this.formData.procureGoods[index], 'goodsOptions', res);
         } else {
@@ -444,9 +450,8 @@
       this.formData.procureGoods[index].modelsIds = [];
       this.formData.procureGoods[index].models = [];
 
-      this.formData.procureGoods[index].baseCategoryId = e[e.length - 1];
       // 鏍规嵁閫変腑鍒嗙被璇锋眰鐗╁搧鍚嶇О鍒楄〃
-      this.getgoodsTemplate(e[e.length - 1], index);
+      this.getgoodsTemplate(e, index);
     },
 
     // 鐗╁搧鍚嶇О鍒楄〃
@@ -475,6 +480,10 @@
 
     // 瑙勬牸鍨嬪彿绉婚櫎
     modelRemoveTag(e, index) {
+      if(e===-1){
+        this.formData.procureGoods[index].models = []
+        return
+      }
       let arr = this.formData.procureGoods[index].models;
       let delIndex = arr.findIndex((v) => v.baseGoodsModelsId == e);
       this.formData.procureGoods[index].models.splice(delIndex, 1);
diff --git a/admin-web/src/views/stock/scrap/itemScrapping/detail.vue b/admin-web/src/views/stock/scrap/itemScrapping/detail.vue
index 7806613..5b81842 100644
--- a/admin-web/src/views/stock/scrap/itemScrapping/detail.vue
+++ b/admin-web/src/views/stock/scrap/itemScrapping/detail.vue
@@ -1,5 +1,5 @@
 <template>
-  <win-md class="stock-detail" :title="setting.title" @close="close" :width="'800px'">
+  <win-md class="stock-detail" :title="setting.title" @close="close" :width="'800px'" :loading="loading">
     <el-row :gutter="20">
       <el-col :span="8">
         <span>鎶ュ簾鍗曞彿锛�</span>
@@ -85,6 +85,7 @@
   },
   data() {
     return {
+      loading: true,
       scrapReasonOptions: [],
       fileList: [],
       detail: {
@@ -110,6 +111,7 @@
   created() {
     scrappedDetail({ id: this.setting.id }).then((res) => {
       this.detail = res;
+      this.loading = false
       this.fileList = this.detail.uploadFiles ? JSON.parse(this.detail.uploadFiles) : [];
       this.$nextTick(() => {
         this.initPreviewImg();
diff --git a/admin-web/src/views/stock/scrap/itemScrapping/edit.vue b/admin-web/src/views/stock/scrap/itemScrapping/edit.vue
index 98b1f00..5fda39f 100644
--- a/admin-web/src/views/stock/scrap/itemScrapping/edit.vue
+++ b/admin-web/src/views/stock/scrap/itemScrapping/edit.vue
@@ -1,6 +1,6 @@
 <template>
   <win-md class="stock-edit" :title="`${setting.title}鎶ュ簾`" @close="close" :width="'800px'">
-    <el-form class="form" ref="ruleForm" :model="formData" :rules="rules" label-width="120px">
+    <el-form v-loading="loading" class="form" ref="ruleForm" :model="formData" :rules="rules" label-width="120px">
       <div class="main-w">
         <el-row :gutter="24" class="headerHeight">
           <el-col :span="12">
@@ -26,6 +26,7 @@
             <el-form-item label="鎶ュ簾鏃堕棿" prop="dealTime">
               <el-date-picker
                 v-model="formData.dealTime"
+                clearable
                 type="datetime"
                 value="yyyy-MM-dd HH:mm:ss"
                 value-format="yyyyMMddHHmmss"
@@ -48,17 +49,20 @@
             <el-col :span="12">
               <el-form-item
                 label="鐗╁搧鍒嗙被"
-                :prop="`scrappedGoodsInfo[${goodsIndex}].baseCategoryIds`"
+                :prop="`scrappedGoodsInfo.${goodsIndex}.baseCategoryId`"
                 :rules="{
                   required: true,
-                  message: '璇烽�夋嫨',
+                  message: '璇烽�夋嫨鐗╁搧鍒嗙被',
                   trigger: 'change',
                 }"
               >
                 <el-cascader
-                  v-model="goodsItem.baseCategoryIds"
+                  v-model="goodsItem.baseCategoryId"
                   :options="categoryOptions"
-                  :props="{ value: 'id' }"
+                  :props="{ value: 'id',emitPath: false }"
+                  :show-all-levels="false"
+                  filterable
+                  clearable
                   @change="categoryChange($event, goodsIndex)"
                   style="width: 100%"
                 ></el-cascader>
@@ -67,13 +71,14 @@
             <el-col :span="12">
               <el-form-item
                 label="鐗╁搧鍚嶇О"
-                :prop="`scrappedGoodsInfo[${goodsIndex}].baseGoodsTemplateId`"
+                :prop="`scrappedGoodsInfo.${goodsIndex}.baseGoodsTemplateId`"
                 :rules="rules.baseGoodsTemplateId"
               >
                 <el-select
                   v-model="goodsItem.baseGoodsTemplateId"
-                  placeholder="璇峰厛鎷╃墿鍝佸垎绫�"
+                  :placeholder="goodsItem.baseCategoryId?'璇烽�夋嫨鐗╁搧':'璇峰厛閫夋嫨鐗╁搧鍒嗙被'"
                   filterable
+                  clearable
                   :disabled="!goodsItem.baseCategoryId"
                   style="width: 100%"
                   @change="goodsTemplateChange($event, goodsIndex)"
@@ -95,17 +100,19 @@
                 :prop="`scrappedGoodsInfo[${goodsIndex}].modelsIds`"
                 :rules="{
                   required: true,
-                  message: '璇烽�夋嫨',
+                  message: '璇烽�夋嫨瑙勬牸鍨嬪彿',
                   trigger: 'change',
                 }"
               >
                 <el-select
                   v-model="goodsItem.modelsIds"
                   multiple
-                  placeholder="璇峰厛鎷╃墿鍝佸悕绉�"
+                  clearable
+                  :placeholder="goodsItem.baseCategoryId?'璇烽�夋嫨瑙勬牸鍨嬪彿':'璇峰厛閫夋嫨鐗╁搧鍚嶇О'"
                   :disabled="!goodsItem.baseCategoryId"
                   @change="modelChange($event, goodsIndex)"
                   @remove-tag="modelRemoveTag($event, goodsIndex)"
+                  @clear="modelRemoveTag(-1, goodsIndex)"
                   style="width: 100%"
                 >
                   <el-option
@@ -209,7 +216,7 @@
       callback();
     };
     return {
-      loading: false,
+      loading: true,
       fileList: [],
       warehouses: [], // 鎶ュ簾浠撳簱鍒楄〃
       categoryOptions: [], // 鐗╁搧鍒嗙被鍒楄〃
@@ -236,8 +243,8 @@
         dealTime: [{ required: true, message: '璇烽�夋嫨', trigger: 'change' }],
         buyType: [{ required: true, message: '璇烽�夋嫨', trigger: 'change' }],
         uploadFiles: [{ required: true, message: '璇蜂笂浼�', trigger: 'change' }],
-        baseCategoryIds: [{ required: true, message: '璇烽�夋嫨', trigger: 'change' }],
-        baseGoodsTemplateId: [{ validator: checkGoodsTemplateId, trigger: ['blur', 'change'] }],
+        baseCategoryId: [{ required: true, message: '璇烽�夋嫨', trigger: 'change' }],
+        baseGoodsTemplateId: [{ required: true, message: '璇烽�夋嫨', trigger: 'change' },{ validator: checkGoodsTemplateId, trigger: ['blur', 'change'] }],
         modelsIds: [{ required: true, message: '璇烽�夋嫨', trigger: 'change' }],
       },
 
@@ -261,9 +268,7 @@
   },
   methods: {
     async init() {
-      this.getWarehouseList();
-      this.getgoodsTemplate();
-      this.getgoodsModel();
+      await this.getWarehouseList();
       await this.getCategoryTree();
       this.formData.scrappedGoodsInfo.push(JSON.parse(JSON.stringify(this.goodsItem)));
       this.formData.operatorId = this.userInfo.id;
@@ -271,6 +276,9 @@
       this.formData.agencyId = this.userInfo.tenantId;
       this.formData.agencyName = this.userInfo.tenantName;
       this.formData.warehouseType = 0;
+      this.getgoodsTemplate();
+      this.getgoodsModel();
+      this.loading = false
       getDicts('SCRAP_REASON').then((res) => {
         this.scrapReasonOptions = res;
       });
@@ -282,8 +290,8 @@
     },
 
     // 鑾峰彇鎶ュ簾浠撳簱鍒楄〃
-    getWarehouseList() {
-      selectTenantWarehouse({ agencyId: this.userInfo.tenantId })
+    async getWarehouseList() {
+      await selectTenantWarehouse({ agencyId: this.userInfo.tenantId })
         .then((res) => {
           this.warehouses = res;
           if (this.warehouses.length && !this.formData.warehouseId) {
@@ -309,7 +317,7 @@
 
     // 鑾峰彇鐗╁搧鍚嶇О鍒楄〃
     getgoodsTemplate(id, index) {
-      goodsTemplate({ categoryId: id || '' }).then((res) => {
+      goodsTemplate({ agencyId: this.userInfo.tenantId, categoryId: id || '' }).then((res) => {
         if (index || index == 0) {
           this.$set(this.formData.scrappedGoodsInfo[index], 'goodsOptions', res);
         } else {
@@ -355,10 +363,8 @@
       this.formData.scrappedGoodsInfo[index].modelsOptions = [];
       this.formData.scrappedGoodsInfo[index].modelsIds = [];
       this.formData.scrappedGoodsInfo[index].scrappedGoodsList = [];
-
-      this.formData.scrappedGoodsInfo[index].baseCategoryId = e[e.length - 1];
       // 鏍规嵁閫変腑鍒嗙被璇锋眰鐗╁搧鍚嶇О鍒楄〃
-      this.getgoodsTemplate(e[e.length - 1], index);
+      this.getgoodsTemplate(e, index);
     },
 
     // 鐗╁搧鍚嶇О鍒楄〃
@@ -394,6 +400,10 @@
 
     // 瑙勬牸鍨嬪彿绉婚櫎
     modelRemoveTag(e, index) {
+      if(e===-1){
+        this.formData.scrappedGoodsInfo[index].scrappedGoodsList = []
+        return
+      }
       let arr = this.formData.scrappedGoodsInfo[index].scrappedGoodsList;
       let delIndex = arr.findIndex((v) => v.baseGoodsModelsId == e);
       this.formData.scrappedGoodsInfo[index].scrappedGoodsList.splice(delIndex, 1);
@@ -419,13 +429,17 @@
     handleSubmit() {
       this.$refs['ruleForm'].validate((valid) => {
         if (valid) {
+          if (this.loading) return
+          this.loading = true;
           scrappedAdd(this.formData)
             .then((res) => {
+              this.loading = false;
               this.$message.success('淇濆瓨鎴愬姛锛�');
               this.close();
               this.$emit('search');
             })
             .catch((err) => {
+              this.loading = false;
               console.log('create err', err);
               this.$message.error('淇濆瓨澶辫触');
             });
diff --git a/admin-web/src/views/stock/transfer/transferApplication/detail.vue b/admin-web/src/views/stock/transfer/transferApplication/detail.vue
index aa1a128..f4c453a 100644
--- a/admin-web/src/views/stock/transfer/transferApplication/detail.vue
+++ b/admin-web/src/views/stock/transfer/transferApplication/detail.vue
@@ -1,76 +1,87 @@
 <template>
   <win-md class="stock-detail" :title="setting.title" @close="close" :width="'800px'" :loading="loading">
-    <div v-loading="loading">
-      <el-row :gutter="20">
-        <el-col :span="8">
-          <span>璋冩嫧鍗曞彿锛�</span>
-          <span>{{ detail.businessFormCode }}</span>
-        </el-col>
-        <el-col :span="8">
-          <span>璋冩嫧鏈烘瀯锛�</span>
-          <span>{{ detail.outAgencyName }}</span>
-        </el-col>
-        <el-col :span="8">
-          <span>鎺ユ敹鏈烘瀯锛�</span>
-          <span>{{ detail.inAgencyName }}</span>
-        </el-col>
-      </el-row>
-      <el-row :gutter="20" style="margin-top: 20px">
-        <el-col :span="8">
-          <span>鐢宠璋冩嫧鏃堕棿锛�</span>
-          <span>{{ detail.createTime | formatTime }}</span>
-        </el-col>
-        <el-col :span="8">
-          <span>鐘舵�侊細</span>
-          <span>{{ getStatesLabel(detail.states) }}</span>
-        </el-col>
-        <el-col :span="8">
-          <span>璋冩嫧鏃堕棿锛�</span>
-          <span>{{ detail.outputTime | formatTime }}</span>
-        </el-col>
-      </el-row>
-      <el-row v-if="fileList && fileList.length" :gutter="20" style="margin-top: 20px">
-        <el-col class="img-row" :span="24">
-          <span>璋冩嫧鎵嬬画鐓х墖锛�</span>
+
+    <el-row :gutter="20">
+      <el-col :span="8">
+        <span>璋冩嫧鍗曞彿锛�</span>
+        <span>{{ detail.businessFormCode }}</span>
+      </el-col>
+      <el-col :span="8">
+        <span>璋冩嫧鏈烘瀯锛�</span>
+        <span>{{ detail.outAgencyName }}</span>
+      </el-col>
+      <el-col :span="8">
+        <span>鎺ユ敹鏈烘瀯锛�</span>
+        <span>{{ detail.inAgencyName }}</span>
+      </el-col>
+    </el-row>
+    <el-row :gutter="20" style="margin-top: 20px">
+      <el-col :span="8">
+        <span>鐢宠璋冩嫧鏃堕棿锛�</span>
+        <span>{{ detail.createTime | formatTime }}</span>
+      </el-col>
+      <el-col :span="8">
+        <span>鐘舵�侊細</span>
+        <span>{{ getStatesLabel(detail.states) }}</span>
+      </el-col>
+      <el-col :span="8">
+        <span>璋冩嫧鏃堕棿锛�</span>
+        <span>{{ detail.outputTime | formatTime }}</span>
+      </el-col>
+    </el-row>
+    <el-row v-if="fileList && fileList.length" :gutter="20" style="margin-top: 20px">
+      <el-col class="img-row" :span="24">
+        <span>璋冩嫧鎵嬬画鐓х墖锛�</span>
         <div class="img-box" v-for="(item, index) in fileList" :key="index" @click="handlePreview(item)">
-          <img class="img" :src="getUrl(item.path)" alt="" />
+          <img class="img" :src="getUrl(item.path)" alt=""/>
         </div>
+      </el-col>
+    </el-row>
+    <div class="goods-card" v-for="(goodsItem, goodsIndex) in detail.formTransferGoods" :key="goodsIndex">
+      <el-row :gutter="20">
+        <el-col :span="12">
+          <span>鐗╁搧鍒嗙被锛�</span>
+          <span>{{ goodsItem.categoryName }}</span>
+        </el-col>
+        <el-col :span="12">
+          <span>鐗╁搧鍚嶇О锛�</span>
+          <span>{{ goodsItem.goodsName }}</span>
         </el-col>
       </el-row>
-      <div class="goods-card" v-for="(goodsItem, goodsIndex) in detail.formTransferGoods" :key="goodsIndex">
-        <el-row :gutter="20">
-          <el-col :span="12">
-            <span>鐗╁搧鍒嗙被锛�</span>
-            <span>{{ goodsItem.categoryName }}</span>
-          </el-col>
-          <el-col :span="12">
-            <span>鐗╁搧鍚嶇О锛�</span>
-            <span>{{ goodsItem.goodsName }}</span>
-          </el-col>
-        </el-row>
-        <el-table :data="goodsItem.models" :stripe="true" style="margin-top: 20px">
-          <el-table-column prop="baseGoodsModelsName" label="瑙勬牸鍨嬪彿" align="center">
-            <template slot-scope="scope">
-              {{ scope.row.baseGoodsModelsName }}
-            </template>
-          </el-table-column>
-          <el-table-column label="鍗曚綅" align="center">
-            <template slot-scope="scope">
-              {{ scope.row.unit }}
-            </template>
-          </el-table-column>
-          <el-table-column prop="counts" label="璋冩嫧鏁伴噺" align="center">
-            <template slot-scope="scope">
-              {{ scope.row.counts }}
-            </template>
-          </el-table-column>
-          <el-table-column prop="price" label="閲戦" align="center">
-            <template slot-scope="scope">
-              {{ scope.row.price }}
-            </template>
-          </el-table-column>
-        </el-table>
-      </div>
+      <el-table :data="goodsItem.models" :stripe="true" style="margin-top: 20px">
+        <el-table-column prop="baseGoodsModelsName" label="瑙勬牸鍨嬪彿" align="center">
+          <template slot-scope="scope">
+            {{ scope.row.baseGoodsModelsName }}
+          </template>
+        </el-table-column>
+        <el-table-column label="鍗曚綅" align="center">
+          <template slot-scope="scope">
+            {{ scope.row.unit }}
+          </template>
+        </el-table-column>
+        <el-table-column prop="counts" label="璋冩嫧鏁伴噺" align="center">
+          <template slot-scope="scope">
+            {{ scope.row.counts }}
+          </template>
+        </el-table-column>
+        <el-table-column prop="price" label="閲戦" align="center">
+          <template slot-scope="scope">
+            {{ scope.row.price }}
+          </template>
+        </el-table-column>
+      </el-table>
+    </div>
+
+    <div id="uploadPreviewImages" style="display: none">
+      <span v-for="(src, index) in fileList" :key="index">
+        <img
+            v-if="checkImg(src.name)"
+            class="v-img"
+            :src="src.url"
+            :alt="src.name"
+            style="width: 100px; height: 100px"
+        />
+      </span>
     </div>
   </win-md>
 </template>
@@ -79,21 +90,28 @@
 import * as DateFormatter from '@/utils/DateFormatter';
 import winMd from '@/components/win/win-md';
 import transfer from '../../../mixins/transfer';
+import {getDownUrl} from "@/utils/base";
+import Viewer from 'viewerjs';
+import 'viewerjs/dist/viewer.css';
+
+let viewer = null;
+
 
 export default {
   mixins: [transfer],
-  components: { winMd },
+  components: {winMd},
   props: {
     setting: {
       type: Object,
-      default: () => {},
+      default: () => {
+      },
     },
   },
   data() {
     return {
       loading: true,
       detail: {},
-      fileList:[]
+      fileList: []
     };
   },
   filters: {
@@ -103,13 +121,54 @@
     },
   },
   created() {
-    transferDetail({ id: this.setting.id }).then((res) => {
+    transferDetail({id: this.setting.id}).then((res) => {
       this.detail = res;
       this.fileList = this.detail.procureDoc ? JSON.parse(this.detail.procureDoc) : [];
       this.loading = false;
+      this.$nextTick(() => {
+        this.initPreviewImg();
+      });
     });
   },
   methods: {
+    initPreviewImg() {
+      if (viewer != null) {
+        viewer.destroy();
+      }
+      const ViewerDom = document.querySelector('#uploadPreviewImages');
+      viewer = new Viewer(ViewerDom, {});
+    },
+    handlePreview(file) {
+      if (!this.checkImg(file.name)) {
+        return false;
+      }
+      let index = 0;
+      for (let i = 0; i < this.fileList.length; i++) {
+        const f = this.fileList[i];
+        if (this.checkImg(f.name)) {
+          if (file.id == f.id) {
+            break;
+          }
+          index++;
+        }
+      }
+      viewer.view(index);
+    },
+    checkImg(name) {
+      const suffix = name.substring(name.lastIndexOf('.'), name.length);
+      const imgArray = ['.jpg', '.jpeg', '.png', '.bmp'];
+      if (imgArray.indexOf(suffix) < 0) {
+        return false;
+      }
+      return true;
+    },
+    getUrl(path) {
+      if (path.substr(0, 7).toLowerCase() == 'http://' || path.substr(0, 8).toLowerCase() == 'https://') {
+        return path;
+      } else {
+        return getDownUrl() + path;
+      }
+    },
     close() {
       this.$emit('close');
     },
diff --git a/admin-web/src/views/stock/transfer/transferApplication/edit.vue b/admin-web/src/views/stock/transfer/transferApplication/edit.vue
index 94e6779..a61c829 100644
--- a/admin-web/src/views/stock/transfer/transferApplication/edit.vue
+++ b/admin-web/src/views/stock/transfer/transferApplication/edit.vue
@@ -1,6 +1,6 @@
 <template>
   <win-md class="stock-edit" title="璋冩嫧鐢宠" @close="close" :width="'800px'">
-    <el-form class="form" ref="ruleForm" :model="formData" :rules="rules" label-width="120px">
+    <el-form v-loading="loading" class="form" ref="ruleForm" :model="formData" :rules="rules" label-width="120px">
       <div class="main-w">
         <el-row :gutter="24" class="headerHeight">
           <el-col :span="12">
@@ -11,10 +11,11 @@
             </el-form-item>
           </el-col>
           <el-col :span="12">
-            <el-form-item label="璋冩嫧鏃堕棿" prop="createTime">
+            <el-form-item label="璋冩嫧鏃堕棿" clearable prop="createTime">
               <el-date-picker
                 v-model="formData.createTime"
                 type="datetime"
+                clearable
                 value="yyyy-MM-dd HH:mm:ss"
                 value-format="yyyyMMddHHmmss"
                 placeholder="璇烽�夋嫨鏃ユ湡"
@@ -27,7 +28,7 @@
         <el-row :gutter="24" class="headerHeight">
           <el-col :span="24">
             <el-form-item label="璋冩嫧鎵嬬画" prop="procureDoc">
-              <upload :settings="uploadSettings" @on-change="uploadChange"></upload>
+              <upload ref="uploadRef" :settings="uploadSettings" @on-change="uploadChange"></upload>
             </el-form-item>
           </el-col>
         </el-row>
@@ -36,17 +37,20 @@
             <el-col :span="12">
               <el-form-item
                 label="鐗╁搧鍒嗙被"
-                :prop="`transferGoods[${goodsIndex}].baseCategoryIds`"
+                :prop="`transferGoods.${goodsIndex}.baseCategoryId`"
                 :rules="{
                   required: true,
-                  message: '璇烽�夋嫨',
+                  message: '璇烽�夋嫨鐗╁搧鍒嗙被',
                   trigger: 'change',
                 }"
               >
                 <el-cascader
-                  v-model="goodsItem.baseCategoryIds"
+                  v-model="goodsItem.baseCategoryId"
                   :options="categoryOptions"
-                  :props="{ value: 'id' }"
+                  :props="{ value: 'id',emitPath: false }"
+                  :show-all-levels="false"
+                  filterable
+                  clearable
                   @change="categoryChange($event, goodsIndex)"
                   style="width: 100%"
                 ></el-cascader>
@@ -55,13 +59,14 @@
             <el-col :span="12">
               <el-form-item
                 label="鐗╁搧鍚嶇О"
-                :prop="`transferGoods[${goodsIndex}].baseGoodsTemplateId`"
+                :prop="`transferGoods.${goodsIndex}.baseGoodsTemplateId`"
                 :rules="rules.baseGoodsTemplateId"
               >
                 <el-select
                   v-model="goodsItem.baseGoodsTemplateId"
-                  placeholder="璇峰厛鎷╃墿鍝佸垎绫�"
+                  :placeholder="goodsItem.baseCategoryId?'璇烽�夋嫨鐗╁搧':'璇峰厛閫夋嫨鐗╁搧鍒嗙被'"
                   filterable
+                  clearable
                   :disabled="!goodsItem.baseCategoryId"
                   style="width: 100%"
                   @change="goodsTemplateChange($event, goodsIndex)"
@@ -90,10 +95,12 @@
                 <el-select
                   v-model="goodsItem.modelsIds"
                   multiple
-                  placeholder="璇峰厛鎷╃墿鍝佸悕绉�"
+                  clearable
+                  :placeholder="goodsItem.baseCategoryId?'璇烽�夋嫨瑙勬牸鍨嬪彿':'璇峰厛閫夋嫨鐗╁搧鍚嶇О'"
                   :disabled="!goodsItem.baseCategoryId"
                   @change="modelChange($event, goodsIndex)"
                   @remove-tag="modelRemoveTag($event, goodsIndex)"
+                  @clear="modelRemoveTag(-1, goodsIndex)"
                   style="width: 100%"
                 >
                   <el-option
@@ -199,12 +206,13 @@
       callback();
     };
     return {
-      loading: false,
+      loading: true,
       agencyOptions: [], // 璋冩嫧鏈烘瀯
       categoryOptions: [], // 鐗╁搧鍒嗙被鍒楄〃
       modelList: [], //鍨嬪彿鍒楄〃
       formData: {
         transferBusinessType: 0, // 鍗曟嵁绫诲瀷銆�0浠撳簱璋冩嫧锛�1閮ㄩ棬鍒嗗彂锛�2閮ㄩ棬鐗╁搧鍥為��
+        procureDoc: '',
         outAgencyId: '', // 璋冩嫧鏈烘瀯id
         createTime: '', // 璋冩嫧鏃堕棿
         transferGoods: [],
@@ -228,9 +236,9 @@
       rules: {
         outAgencyId: [{ required: true, message: '璇烽�夋嫨', trigger: 'change' }],
         createTime: [{ required: true, message: '璇烽�夋嫨', trigger: 'change' }],
-
+        procureDoc: [{ required: true, message: '璇蜂笂浼犺皟鎷ㄦ墜缁�', trigger: 'change' }],
         baseCategoryIds: [{ required: true, message: '璇烽�夋嫨', trigger: 'change' }],
-        baseGoodsTemplateId: [{ validator: checkGoodsTemplateId, trigger: ['blur', 'change'] }],
+        baseGoodsTemplateId: [{ required: true, message: '璇烽�夋嫨', trigger: 'change' },{ validator: checkGoodsTemplateId, trigger: ['blur', 'change'] }],
         modelsIds: [{ required: true, message: '璇烽�夋嫨', trigger: 'change' }],
         counts: [
           { required: true, message: '璇疯緭鍏�', trigger: 'change' },
@@ -242,12 +250,11 @@
         title: '涓婁紶',
         max: 20, // 鏈�澶уぇ灏忥紝鍗曚綅M
         num: 2, // 鏀寔涓婁紶鍥剧墖涓暟
-        accept: '.jpg,.png', // 闄愬埗鏍煎紡
         tip: '', // 鎻愮ず 榛樿锛歚鍙兘涓婁紶${this.defaultSettings.num}涓�${this.defaultSettings.accept}鏂囦欢锛屼笖涓嶈秴杩�${this.defaultSettings.max}kb`
         uploadUrl: getUploadUrl(), // 涓婁紶璺緞
         multiple: true, // 鏄惁鏀寔鎵归噺涓婁紶
         disabled: false, // 鏄惁绂佺敤
-        type: 'text', // text/picture
+        type: 'picture', // text/picture
       },
     };
   },
@@ -259,15 +266,16 @@
   },
   methods: {
     async init() {
-      this.handegetParentTenant();
+      await this.handegetParentTenant();
+      await this.getCategoryTree();
+      this.loading = false
       this.getgoodsTemplate();
       this.getgoodsModel();
-      this.getCategoryTree();
     },
 
     // 鑾峰彇涓婄骇鏈烘瀯
-    handegetParentTenant() {
-      getParentTenant().then((res) => {
+    async handegetParentTenant() {
+      await getParentTenant().then((res) => {
         if (res.id != this.userInfo.tenantId) {
           this.agencyOptions = [res];
           this.formData.outAgencyId = res.id;
@@ -343,10 +351,8 @@
       this.formData.transferGoods[index].modelsOptions = [];
       this.formData.transferGoods[index].modelsIds = [];
       this.formData.transferGoods[index].models = [];
-
-      this.formData.transferGoods[index].baseCategoryId = e[e.length - 1];
       // 鏍规嵁閫変腑鍒嗙被璇锋眰鐗╁搧鍚嶇О鍒楄〃
-      this.getgoodsTemplate(e[e.length - 1], index);
+      this.getgoodsTemplate(e, index);
     },
 
     // 鐗╁搧鍚嶇О鍒楄〃閫夋嫨
@@ -382,6 +388,10 @@
 
     // 瑙勬牸鍨嬪彿绉婚櫎
     modelRemoveTag(e, index) {
+      if(e===-1){
+        this.formData.transferGoods[index].models = []
+        return
+      }
       let arr = this.formData.transferGoods[index].models;
       let delIndex = arr.findIndex((v) => v.baseGoodsModelsId == e);
       this.formData.transferGoods[index].models.splice(delIndex, 1);
@@ -389,7 +399,8 @@
 
     // 涓婁紶
     uploadChange(e) {
-      console.log('uploadChange', e);
+      let arr = this.$refs.uploadRef.fileList;
+      this.formData.procureDoc = JSON.stringify(arr);
     },
 
     // 鐐瑰嚮鏂板鐗╁搧
@@ -420,14 +431,17 @@
     handleSubmit() {
       this.$refs['ruleForm'].validate((valid) => {
         if (valid) {
-          console.log('this.formData', this.formData);
+          if(this.loading) return
+          this.loading = true
           transferAdd(this.formData)
             .then((res) => {
+              this.loading = false
               this.$message.success('淇濆瓨鎴愬姛锛�');
               this.close();
               this.$emit('search');
             })
             .catch((err) => {
+              this.loading = false
               console.log('edit err', err);
               this.$message.error('淇濆瓨澶辫触');
             });
diff --git a/admin-web/src/views/stock/transfer/transferissue/detail.vue b/admin-web/src/views/stock/transfer/transferissue/detail.vue
index 0294b76..696d12c 100644
--- a/admin-web/src/views/stock/transfer/transferissue/detail.vue
+++ b/admin-web/src/views/stock/transfer/transferissue/detail.vue
@@ -1,84 +1,94 @@
 <template>
-  <win-md class="stock-detail" :title="setting.title" @close="close" :width="'1100px'">
-    <div v-loading="loading">
-      <el-row :gutter="20">
-        <el-col :span="6">
-          <span>璋冩嫧鍗曞彿锛�</span>
-          <span>{{ detail.businessFormCode }}</span>
-        </el-col>
-        <el-col :span="6">
-          <span>璋冩嫧鏈烘瀯锛�</span>
-          <span>{{ detail.outAgencyName }}</span>
-        </el-col>
-        <el-col :span="6">
-          <span>璋冩嫧浜猴細</span>
-          <span>{{ detail.outOperatorName || '-' }}</span>
-        </el-col>
-        <el-col :span="6">
-          <span>鎺ユ敹鏈烘瀯锛�</span>
-          <span>{{ detail.inAgencyName }}</span>
-        </el-col>
-      </el-row>
-      <el-row :gutter="20" style="margin-top: 20px">
-        <el-col :span="6">
-          <span>鐢宠浜猴細</span>
-          <span>{{ detail.operatorName }}</span>
-        </el-col>
-        <el-col :span="6">
-          <span>鐢宠璋冩嫧鏃堕棿锛�</span>
-          <span>{{ detail.createTime | formatTime }}</span>
-        </el-col>
-        <el-col :span="6">
-          <span>鐘舵�侊細</span>
-          <span>{{ getStatesLabel(detail.states) }}</span>
-        </el-col>
-        <el-col :span="6">
-          <span>璋冩嫧鏃堕棿锛�</span>
-          <span>{{ detail.outputTime | formatTime }}</span>
-        </el-col>
-      </el-row>
-      <el-row v-if="fileList && fileList.length" :gutter="20" style="margin-top: 20px">
-        <el-col class="img-row" :span="24">
-          <span>璋冩嫧鎵嬬画鐓х墖锛�</span>
+  <win-md class="stock-detail" :loading="loading" :title="setting.title" @close="close" :width="'1100px'">
+    <el-row :gutter="20">
+      <el-col :span="6">
+        <span>璋冩嫧鍗曞彿锛�</span>
+        <span>{{ detail.businessFormCode }}</span>
+      </el-col>
+      <el-col :span="6">
+        <span>璋冩嫧鏈烘瀯锛�</span>
+        <span>{{ detail.outAgencyName }}</span>
+      </el-col>
+      <el-col :span="6">
+        <span>璋冩嫧浜猴細</span>
+        <span>{{ detail.outOperatorName || '-' }}</span>
+      </el-col>
+      <el-col :span="6">
+        <span>鎺ユ敹鏈烘瀯锛�</span>
+        <span>{{ detail.inAgencyName }}</span>
+      </el-col>
+    </el-row>
+    <el-row :gutter="20" style="margin-top: 20px">
+      <el-col :span="6">
+        <span>鐢宠浜猴細</span>
+        <span>{{ detail.operatorName }}</span>
+      </el-col>
+      <el-col :span="6">
+        <span>鐢宠璋冩嫧鏃堕棿锛�</span>
+        <span>{{ detail.createTime | formatTime }}</span>
+      </el-col>
+      <el-col :span="6">
+        <span>鐘舵�侊細</span>
+        <span>{{ getStatesLabel(detail.states) }}</span>
+      </el-col>
+      <el-col :span="6">
+        <span>璋冩嫧鏃堕棿锛�</span>
+        <span>{{ detail.outputTime | formatTime }}</span>
+      </el-col>
+    </el-row>
+    <el-row v-if="fileList && fileList.length" :gutter="20" style="margin-top: 20px">
+      <el-col class="img-row" :span="24">
+        <span>璋冩嫧鎵嬬画鐓х墖锛�</span>
         <div class="img-box" v-for="(item, index) in fileList" :key="index" @click="handlePreview(item)">
-          <img class="img" :src="getUrl(item.path)" alt="" />
+          <img class="img" :src="getUrl(item.path)" alt=""/>
         </div>
+      </el-col>
+    </el-row>
+    <div class="goods-card" v-for="(goodsItem, goodsIndex) in detail.formTransferGoods" :key="goodsIndex">
+      <el-row :gutter="20">
+        <el-col :span="12">
+          <span>鐗╁搧鍒嗙被锛�</span>
+          <span>{{ goodsItem.categoryName }}</span>
+        </el-col>
+        <el-col :span="12">
+          <span>鐗╁搧鍚嶇О锛�</span>
+          <span>{{ goodsItem.goodsName }}</span>
         </el-col>
       </el-row>
-      <div class="goods-card" v-for="(goodsItem, goodsIndex) in detail.formTransferGoods" :key="goodsIndex">
-        <el-row :gutter="20">
-          <el-col :span="12">
-            <span>鐗╁搧鍒嗙被锛�</span>
-            <span>{{ goodsItem.categoryName }}</span>
-          </el-col>
-          <el-col :span="12">
-            <span>鐗╁搧鍚嶇О锛�</span>
-            <span>{{ goodsItem.goodsName }}</span>
-          </el-col>
-        </el-row>
-        <el-table :data="goodsItem.models" :stripe="true" style="margin-top: 20px">
-          <el-table-column prop="baseGoodsModelsName" label="瑙勬牸鍨嬪彿" align="center">
-            <template slot-scope="scope">
-              {{ scope.row.baseGoodsModelsName }}
-            </template>
-          </el-table-column>
-          <el-table-column label="鍗曚綅" align="center">
-            <template slot-scope="scope">
-              {{ scope.row.unit }}
-            </template>
-          </el-table-column>
-          <el-table-column prop="counts" label="璋冩嫧鏁伴噺" align="center">
-            <template slot-scope="scope">
-              {{ scope.row.counts }}
-            </template>
-          </el-table-column>
-          <el-table-column prop="price" label="閲戦" align="center">
-            <template slot-scope="scope">
-              {{ scope.row.price }}
-            </template>
-          </el-table-column>
-        </el-table>
-      </div>
+      <el-table :data="goodsItem.models" :stripe="true" style="margin-top: 20px">
+        <el-table-column prop="baseGoodsModelsName" label="瑙勬牸鍨嬪彿" align="center">
+          <template slot-scope="scope">
+            {{ scope.row.baseGoodsModelsName }}
+          </template>
+        </el-table-column>
+        <el-table-column label="鍗曚綅" align="center">
+          <template slot-scope="scope">
+            {{ scope.row.unit }}
+          </template>
+        </el-table-column>
+        <el-table-column prop="counts" label="璋冩嫧鏁伴噺" align="center">
+          <template slot-scope="scope">
+            {{ scope.row.counts }}
+          </template>
+        </el-table-column>
+        <el-table-column prop="price" label="閲戦" align="center">
+          <template slot-scope="scope">
+            {{ scope.row.price }}
+          </template>
+        </el-table-column>
+      </el-table>
+    </div>
+
+    <div id="uploadPreviewImages" style="display: none">
+      <span v-for="(src, index) in fileList" :key="index">
+        <img
+            v-if="checkImg(src.name)"
+            class="v-img"
+            :src="src.url"
+            :alt="src.name"
+            style="width: 100px; height: 100px"
+        />
+      </span>
     </div>
   </win-md>
 </template>
@@ -87,21 +97,27 @@
 import * as DateFormatter from '@/utils/DateFormatter';
 import winMd from '@/components/win/win-md';
 import transfer from '../../../mixins/transfer';
+import {getDownUrl} from "@/utils/base";
+import Viewer from 'viewerjs';
+import 'viewerjs/dist/viewer.css';
+
+let viewer = null;
 
 export default {
   mixins: [transfer],
-  components: { winMd },
+  components: {winMd},
   props: {
     setting: {
       type: Object,
-      default: () => {},
+      default: () => {
+      },
     },
   },
   data() {
     return {
       loading: false,
       detail: {},
-      fileList:[]
+      fileList: []
     };
   },
   filters: {
@@ -112,13 +128,60 @@
   },
   created() {
     this.loading = true;
-    transferDetail({ id: this.setting.id }).then((res) => {
+    transferDetail({id: this.setting.id}).then((res) => {
       this.detail = res;
-      this.fileList = this.detail.procureDoc ? JSON.parse(this.detail.procureDoc) : [];
+      this.fileList = this.detail.doc ? JSON.parse(this.detail.doc) : [];
       this.loading = false;
+      this.$nextTick(() => {
+        this.initPreviewImg();
+      });
     });
   },
   methods: {
+    initPreviewImg() {
+      if (viewer != null) {
+        viewer.destroy();
+      }
+      const ViewerDom = document.querySelector('#uploadPreviewImages');
+      viewer = new Viewer(ViewerDom, {});
+    },
+    handlePreview(file) {
+      if (!this.checkImg(file.name)) {
+        return false;
+      }
+      let index = 0;
+      for (let i = 0; i < this.fileList.length; i++) {
+        const f = this.fileList[i];
+        if (this.checkImg(f.name)) {
+          if (file.id == f.id) {
+            break;
+          }
+          index++;
+        }
+      }
+      // this.fileList.forEach((f, i) => {
+      //   if (file.uid == f.uid) {
+      //     index = i
+      //   }
+      // })
+      // document.querySelector('#uploadPreviewImages').children[0].click()
+      viewer.view(index);
+    },
+    checkImg(name) {
+      const suffix = name.substring(name.lastIndexOf('.'), name.length);
+      const imgArray = ['.jpg', '.jpeg', '.png', '.bmp'];
+      if (imgArray.indexOf(suffix) < 0) {
+        return false;
+      }
+      return true;
+    },
+    getUrl(path) {
+      if (path.substr(0, 7).toLowerCase() == 'http://' || path.substr(0, 8).toLowerCase() == 'https://') {
+        return path;
+      } else {
+        return getDownUrl() + path;
+      }
+    },
     close() {
       this.$emit('close');
     },

--
Gitblit v1.9.1