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