From d5f70e01396783b1d2b84b49344b6d2798eb1097 Mon Sep 17 00:00:00 2001 From: 马宇豪 <978517621@qq.com> Date: 星期二, 19 十二月 2023 16:09:48 +0800 Subject: [PATCH] 仓储管理 --- src/views/stock/components/enterprisePurchaseDetail.vue | 9 src/views/license/licenseInfo/components/licenseDelayForm.vue | 4 src/views/stock/stockManage.vue | 6 src/views/purchase/dailySaleReport.vue | 23 config/index.js | 2 src/views/purchase/person.vue | 3 src/views/stock/enterprisePurchaseStatistics.vue | 4 src/api/warehouse.js | 213 ++++ src/views/warehouse/components/stockRecords.vue | 261 ++++++ src/views/warehouse/stockSupervision.vue | 403 +++++++++ src/views/warehouse/components/enterpriseStock.vue | 103 ++ src/views/warehouse/components/addStock.vue | 365 ++++++++ config/dev.env.js | 6 src/views/license/licenseInfo/components/licenseModForm.vue | 12 src/views/warehouse/stockManage.vue | 218 +++++ src/views/layout/components/AppMain.vue | 2 src/views/warehouse/components/editStock.vue | 146 +++ src/views/warehouse/stockAnalyse.vue | 425 +++++++++ src/views/layout/Layout.vue | 4 src/views/specialCheck/index.vue | 4 src/views/warehouse/components/recordDetail.vue | 162 +++ src/views/warehouse/components/deliverUsage.vue | 139 +++ src/views/license/licenseInfo/components/licenseInfoForm.vue | 12 23 files changed, 2,486 insertions(+), 40 deletions(-) diff --git a/config/dev.env.js b/config/dev.env.js index 680a165..4007947 100644 --- a/config/dev.env.js +++ b/config/dev.env.js @@ -18,8 +18,10 @@ // IMG_API: '"http://39.104.85.193:4105/upload/"', // // -// BASE_API: '"http://192.168.0.31:8100"', -// IMG_API: '"http://192.168.0.31:8100/upload/"', +// BASE_API: '"http://192.168.0.70:8100"', +// IMG_API: '"http://192.168.0.70:8100/upload/"', + + // 正式地址 BASE_API: '"http://39.104.85.193:4105"', IMG_API: '"http://39.104.85.193:4105/upload/"', // IMG_API: '"http://127.0.0.1:8100/upload/"', diff --git a/config/index.js b/config/index.js index da68a8d..a52ff93 100644 --- a/config/index.js +++ b/config/index.js @@ -15,7 +15,7 @@ // can be overwritten by process.env.HOST // if you want dev by ip, please set host: '0.0.0.0' - host: 'localhost', + host: '192.168.0.65', port: 8101, // can be overwritten by process.env.PORT, if port is in use, a free one will be determined autoOpenBrowser: true, errorOverlay: true, diff --git a/src/api/warehouse.js b/src/api/warehouse.js new file mode 100644 index 0000000..75fd542 --- /dev/null +++ b/src/api/warehouse.js @@ -0,0 +1,213 @@ +import request from '@/utils/request' +import { getToken } from '@/utils/auth' + +export function getStorehouseDataByUser(data) { + return request({ + headers: { + 'Authorization': getToken() + }, + url: process.env.BASE_API + '/reserveManage/select/getStorehouseDataByUser', + method: 'post', + data + }) +} + +export function getReservesForUser(params) { + return request({ + headers: { + 'Authorization': getToken() + }, + url: process.env.BASE_API + '/reserveManage/select/getReservesForUser', + method: 'get', + params: params || {} + }) +} + +export function saveReserveInfo(data) { + return request({ + headers: { + 'Authorization': getToken() + }, + url: process.env.BASE_API + '/reserveManage/insert/saveReserveInfo', + method: 'post', + data + }) +} + +export function editReserveInfo(data) { + return request({ + headers: { + 'Authorization': getToken() + }, + url: process.env.BASE_API + '/reserveManage/update/editReserveInfo', + method: 'post', + data + }) +} + +export function getInfoById(params) { + return request({ + headers: { + 'Authorization': getToken() + }, + url: process.env.BASE_API + '/reserveManage/select/getReserveAndStorehouseInfo', + method: 'get', + params: params || {} + }) +} + +// 授权信息 +export function listStockhouseEnterpriseUserInfo(params) { + return request({ + headers: { + 'Authorization': getToken() + }, + url: process.env.BASE_API + '/reserveManage/select/listStockhouseEnterpriseUserInfo', + method: 'get', + params: params || {} + }) +} + +// 修改授权信息 +export function editEnterpriseUserAuthority(data) { + return request({ + headers: { + 'Authorization': getToken() + }, + url: process.env.BASE_API + '/reserveManage/update/editEnterpriseUserAuthority', + method: 'post', + data + }) +} + +// 各企业存货信息 +export function listStockDataByStorehouseId(params) { + return request({ + headers: { + 'Authorization': getToken() + }, + url: process.env.BASE_API + '/reserveManage/select/listStockDataByStorehouseId', + method: 'get', + params: params || {} + }) +} + +// 进行盘库 +export function updateStorehouseData(data) { + return request({ + headers: { + 'Authorization': getToken() + }, + url: process.env.BASE_API + '/reserveManage/update/updateStorehouseData', + method: 'post', + data + }) +} + +// 进行盘库 +export function getStorehouseData(params) { + return request({ + headers: { + 'Authorization': getToken() + }, + url: process.env.BASE_API + '/reserveManage/select/getStorehouseData', + method: 'get', + params: params || {} + }) +} + +// 开关盘库 +export function changeInventory(data) { + return request({ + headers: { + 'Authorization': getToken() + }, + url: process.env.BASE_API + '/reserveManage/update/openInventory', + method: 'post', + data + }) +} + +export function delStore(params) { + return request({ + headers: { + 'Authorization': getToken() + }, + url: process.env.BASE_API + '/reserveManage/delete/deleteStorehouseById', + method: 'get', + params: params || {} + }) +} + + +// 监管 +export function getSupervisionStatistics(data) { + return request({ + headers: { + 'Authorization': getToken() + }, + url: process.env.BASE_API + '/warehouse/supervision/statistics', + method: 'post', + data + }) +} + +// 出库记录 +export function getOutboundQuery(data) { + return request({ + headers: { + 'Authorization': getToken() + }, + url: process.env.BASE_API + '/delivery/store/house/outbound-query', + method: 'post', + data + }) +} + +// 出库详情 +export function getOutboundDetail(data) { + return request({ + headers: { + 'Authorization': getToken() + }, + url: process.env.BASE_API + '/delivery/store/house/outbound-detail', + method: 'post', + data + }) +} + +// 入库记录 +export function getInboundQuery(data) { + return request({ + headers: { + 'Authorization': getToken() + }, + url: process.env.BASE_API + '/entry/store/house/inbound-query', + method: 'post', + data + }) +} + +// 入库详情 +export function getInboundDetail(data) { + return request({ + headers: { + 'Authorization': getToken() + }, + url: process.env.BASE_API + '/entry/store/house/inbound-detail', + method: 'post', + data + }) +} + +// 汇总分析 +export function getAnalysis(data) { + return request({ + headers: { + 'Authorization': getToken() + }, + url: process.env.BASE_API + '/warehouse/analysis/statistics', + method: 'post', + data + }) +} diff --git a/src/views/layout/Layout.vue b/src/views/layout/Layout.vue index fa534de..e2f1ad4 100644 --- a/src/views/layout/Layout.vue +++ b/src/views/layout/Layout.vue @@ -18,8 +18,8 @@ :label="item.meta.title" :name="item.path" > - <div class="main-container"> - <app-main /> + <div class="main-container" v-if="editableTabsValue == item.path"> + <app-main/> </div> </el-tab-pane> </el-tabs> diff --git a/src/views/layout/components/AppMain.vue b/src/views/layout/components/AppMain.vue index a4be393..d082f17 100644 --- a/src/views/layout/components/AppMain.vue +++ b/src/views/layout/components/AppMain.vue @@ -2,7 +2,7 @@ <section class="app-main"> <transition name="fade-transform" mode="out-in"> <keep-alive :include="cachedViews"> - <router-view :key="key" /> + <router-view :key="key"/> </keep-alive> </transition> </section> diff --git a/src/views/license/licenseInfo/components/licenseDelayForm.vue b/src/views/license/licenseInfo/components/licenseDelayForm.vue index 11ce664..af0af69 100644 --- a/src/views/license/licenseInfo/components/licenseDelayForm.vue +++ b/src/views/license/licenseInfo/components/licenseDelayForm.vue @@ -734,8 +734,8 @@ checkMore4:[], checkMore5:[], checkMore6:[], - checkList1:['C级'], - checkList2:['D级'], + checkList1:['C级','D级'], + checkList2:['C级','D级'], checkMoreList:['C级','D级'], storage1:{ id:null, diff --git a/src/views/license/licenseInfo/components/licenseInfoForm.vue b/src/views/license/licenseInfo/components/licenseInfoForm.vue index 4821401..fbacdc3 100644 --- a/src/views/license/licenseInfo/components/licenseInfoForm.vue +++ b/src/views/license/licenseInfo/components/licenseInfoForm.vue @@ -732,8 +732,8 @@ checkMore4:[], checkMore5:[], checkMore6:[], - checkList1:['C级'], - checkList2:['D级'], + checkList1:['C级','D级'], + checkList2:['C级','D级'], checkMoreList:['C级','D级'], storage1:{ id:null, @@ -1088,13 +1088,13 @@ justifySingle(value){ if(value === 1){ if(this.checked1 === true){ - this.checkMore1 = ['C级'] + this.checkMore1 = ['C级','D级'] }else{ this.checkMore1 = [] } }else if(value ===2){ if(this.checked2 === true){ - this.checkMore2 = ['D级'] + this.checkMore2 = ['C级','D级'] }else{ this.checkMore2 = [] } @@ -1106,7 +1106,7 @@ } }else if(value === 4){ if(this.checked4 === true){ - this.checkMore4 = ['C级'] + this.checkMore4 = ['C级','D级'] }else{ this.checkMore4 = [] } @@ -1118,7 +1118,7 @@ } }else{ if(this.checked6 === true){ - this.checkMore6 = ['D级'] + this.checkMore6 = ['C级','D级'] }else{ this.checkMore6 = [] } diff --git a/src/views/license/licenseInfo/components/licenseModForm.vue b/src/views/license/licenseInfo/components/licenseModForm.vue index 7bd36aa..a1c3147 100644 --- a/src/views/license/licenseInfo/components/licenseModForm.vue +++ b/src/views/license/licenseInfo/components/licenseModForm.vue @@ -737,8 +737,8 @@ checkMore4:[], checkMore5:[], checkMore6:[], - checkList1:['C级'], - checkList2:['D级'], + checkList1:['C级','D级'], + checkList2:['C级','D级'], checkMoreList:['C级','D级'], storage1:{ id:null, @@ -980,13 +980,13 @@ justifySingle(value){ if(value === 1){ if(this.checked1 === true){ - this.checkMore1 = ['C级'] + this.checkMore1 = ['C级','D级'] }else{ this.checkMore1 = [] } }else if(value ===2){ if(this.checked2 === true){ - this.checkMore2 = ['D级'] + this.checkMore2 = ['C级','D级'] }else{ this.checkMore2 = [] } @@ -998,7 +998,7 @@ } }else if(value === 4){ if(this.checked4 === true){ - this.checkMore4 = ['C级'] + this.checkMore4 = ['C级','D级'] }else{ this.checkMore4 = [] } @@ -1010,7 +1010,7 @@ } }else{ if(this.checked6 === true){ - this.checkMore6 = ['D级'] + this.checkMore6 = ['C级','D级'] }else{ this.checkMore6 = [] } diff --git a/src/views/purchase/dailySaleReport.vue b/src/views/purchase/dailySaleReport.vue index db9656c..0aff90d 100644 --- a/src/views/purchase/dailySaleReport.vue +++ b/src/views/purchase/dailySaleReport.vue @@ -1,6 +1,6 @@ <template> <div class="container"> - <div class="filter-container"> + <div class="filter-container" style="padding: 20px"> <el-row> 时间:   <el-date-picker @@ -11,16 +11,16 @@ :clearable="false" :default-time="['00:00:00','23:59:59']"> </el-date-picker> + <el-button class="filter-item" style="margin-left: 10px;margin-bottom: 0" type="primary" icon="el-icon-back" + @click="dayForward">前一天</el-button> + <el-button class="filter-item" style="margin-left: 10px;margin-bottom: 0" type="primary" icon="el-icon-right" + @click="dayBackward">后一天</el-button> +<!-- <el-button class="filter-item" style="margin-left: 10px;margin-bottom: 0" type="primary" icon="el-icon-search"--> +<!-- @click="queryHandle"/>--> </el-row> <el-row style="padding-top: 10px"> - <el-button class="filter-item" style="margin-left: 10px;" type="primary" icon="el-icon-back" - @click="dayForward">前一天</el-button> - <el-button class="filter-item" style="margin-left: 10px;" type="primary" icon="el-icon-right" - @click="dayBackward">后一天</el-button> - <el-button class="filter-item" style="margin-left: 10px;" type="primary" icon="el-icon-search" - @click="queryHandle"/> </el-row> </div> <div class="table_content"> @@ -114,9 +114,9 @@ this.queryDateHandle(); }, methods:{ - queryHandle(){ - this.getReportList(); - }, + // queryHandle(){ + // this.getReportList(); + // }, getReportList(){ const _this = this; const params = {}; @@ -178,6 +178,7 @@ end.setMinutes(59); end.setSeconds(59); this.dateRange = [start,end] + this.getReportList() } }, dayBackward(){ @@ -193,6 +194,7 @@ end.setMinutes(59); end.setSeconds(59); this.dateRange = [start,end] + this.getReportList() } }, queryDateHandle(){ @@ -207,6 +209,7 @@ this.dateRange.push(start,end); this.startDate = start; this.endDate = end; + this.getReportList() }, sortChange(param){ this.sort = param.prop; diff --git a/src/views/purchase/person.vue b/src/views/purchase/person.vue index cd82d61..b9030ae 100644 --- a/src/views/purchase/person.vue +++ b/src/views/purchase/person.vue @@ -206,7 +206,7 @@ import Cookies from "js-cookie"; export default { - name: "addSelfExam", + name: "person", data(){ return{ tableKey:'', @@ -282,6 +282,7 @@ uploadDialog }, created() { + console.log('Component created:', this.$options.name); this.initValidTime() this.getPersonProductList() this.getProvince() diff --git a/src/views/specialCheck/index.vue b/src/views/specialCheck/index.vue index 6f64d86..b5ac286 100644 --- a/src/views/specialCheck/index.vue +++ b/src/views/specialCheck/index.vue @@ -109,8 +109,10 @@ t.$refs.wholesale.currentPage = 1 t.$refs.wholesale.pageSize = 10 if(key.split('-')[1] == '1' || key.split('-')[1] == '2'){ + console.log(keyPath,'path') t.$refs.wholesale.taskId = Number(keyPath[0].split('-')[0]) - t.$refs.wholesale.taskName = keyPath[0].split('-')[1] + t.$refs.wholesale.taskName = keyPath[0].split('-').slice(1).join('-') + console.log(t.$refs.wholesale.taskName,'name') t.$refs.wholesale.enterpriseType = Number(key.split('-')[1]) t.$refs.wholesale.getEnterpriseCompleteInfoList() }else{ diff --git a/src/views/stock/components/enterprisePurchaseDetail.vue b/src/views/stock/components/enterprisePurchaseDetail.vue index 9c8a95c..f8e27a5 100644 --- a/src/views/stock/components/enterprisePurchaseDetail.vue +++ b/src/views/stock/components/enterprisePurchaseDetail.vue @@ -6,7 +6,7 @@ :append-to-body="true" > <div class="app-container"> - <div class="table_title">新疆吉庆烟花爆竹有限公司<span v-if="timeValue!==''">({{ timeValue }})</span>进货情况</div> + <div class="table_title">{{company}}<span v-if="timeValue!==''">({{ timeValue }})</span>进货情况</div> <div class="table_content"> <el-table v-loading="listLoading" @@ -50,6 +50,7 @@ return{ scList: [], timeValue: '', + company: '', tableKey:'', listLoading:false, purchaseDetailVisible:false, @@ -57,8 +58,9 @@ }, components: {}, methods:{ - open(scItems,timeRange,startTime,endTime){ - this.scList = scItems; + open(data,timeRange,startTime,endTime){ + this.scList = data.scItems + this.company = data.pifaCompany for(let i of this.scList){ i.firecracker = i.items.filter(it=>it.type === '爆竹类').length>0?i.items.filter(it=>it.type === '爆竹类')[0].boxCount:0 i.spray = i.items.filter(it=>it.type === '喷花类').length>0?i.items.filter(it=>it.type === '喷花类')[0].boxCount:0 @@ -72,6 +74,7 @@ if(timeRange){ this.timeValue = startTime.split(' ')[0] + '~' + endTime.split(' ')[0] } + } } } diff --git a/src/views/stock/enterprisePurchaseStatistics.vue b/src/views/stock/enterprisePurchaseStatistics.vue index cc76fbb..d2f9e72 100644 --- a/src/views/stock/enterprisePurchaseStatistics.vue +++ b/src/views/stock/enterprisePurchaseStatistics.vue @@ -379,9 +379,9 @@ }, showDetail(param){ if( this.validTime !== null ){ - this.$refs.purchaseDetail.open(param.scItems,true,this.validTime[0],this.validTime[1]) + this.$refs.purchaseDetail.open(param,true,this.validTime[0],this.validTime[1]) }else{ - this.$refs.purchaseDetail.open(param.scItems,false) + this.$refs.purchaseDetail.open(param,false) } }, }, diff --git a/src/views/stock/stockManage.vue b/src/views/stock/stockManage.vue index 7a5d2f0..913ec42 100644 --- a/src/views/stock/stockManage.vue +++ b/src/views/stock/stockManage.vue @@ -94,9 +94,9 @@ }, created() { const t = this - setTimeout(()=>{ - t.$refs.deliverUsage.open() - },1000) + // setTimeout(()=>{ + // t.$refs.deliverUsage.open() + // },1000) }, mounted() { }, diff --git a/src/views/warehouse/components/addStock.vue b/src/views/warehouse/components/addStock.vue new file mode 100644 index 0000000..b07eca3 --- /dev/null +++ b/src/views/warehouse/components/addStock.vue @@ -0,0 +1,365 @@ +<template> + <el-dialog :visible.sync="dialogVisible" :modal-append-to-body="false" :close-on-click-modal="false" :title="dialogTitle" center + width="75%" @close="reset()"> + <el-form ref="dataForm" :rules="dataFormRules" :model="dataForm" label-position="right" label-width="150px" element-loading-text="保存中..."> + <div class="part-title"> + <span>库区基本信息填写</span> + </div> + <el-divider></el-divider> + <div> + <el-row :gutter="20"> + <el-col :span="12"> + <el-form-item label="库区名称:" prop="reserveName" > + <el-input v-model.trim="dataForm.reserveName"/> + </el-form-item> + </el-col> + <el-col :span="12"> + <el-form-item label="所属企业:"> + <el-input disabled v-model.trim="dataForm.company"/> + </el-form-item> + </el-col> + </el-row> + <el-row :gutter="20"> + <el-col :span="10"> + <el-form-item label="所属省份:" prop="province"> + <el-select v-model="dataForm.province" clearable @change="changeArea('province')" style="width: 100%;"> + <el-option + v-for="item in provinceList" + :key="item.id" + :label="item.name" + :value="item.name" + > + </el-option> + </el-select> + </el-form-item> + </el-col> + <el-col :span="6"> + <el-form-item prop="city" class="selector"> + <el-select v-model="dataForm.city" prop="city" clearable @change="changeArea('city')" style="width: 100%;"> + <el-option + v-for="item in cityList" + :key="item.id" + :label="item.name" + :value="item.name" + > + </el-option> + </el-select> + </el-form-item> + </el-col> + <el-col :span="6"> + <el-form-item prop="area" class="selector"> + <el-select v-model="dataForm.area" clearable filterable @change="changeArea('district')" style="width: 100%;"> + <el-option + v-for="item in districtList" + :key="item.id" + :label="item.name" + :value="item.name" + > + </el-option> + </el-select> + </el-form-item> + </el-col> + </el-row> + <el-row> + <el-col :span="22"> + <el-form-item label="库区地址:" prop="reserveAddress" > + <el-input v-model.trim="dataForm.reserveAddress"/> + </el-form-item> + </el-col> + </el-row> + <el-row :gutter="20"> + <el-col :span="11"> + <el-form-item label="库区总面积:" prop="square" class="numInput"> + <el-input type="number" v-model.number="dataForm.square"><template slot="append">㎡</template></el-input> + </el-form-item> + </el-col> + <el-col :span="11"> + <el-form-item label="有效仓储面积:" prop="effectiveStorageSquare" class="numInput"> + <el-input type="number" v-model.number="dataForm.effectiveStorageSquare"><template slot="append">㎡</template></el-input> + </el-form-item> + </el-col> + </el-row> + <el-row :gutter="20"> + <el-col :span="11"> + <el-form-item label="核定储量:" prop="approvedReserves" class="numInput"> + <el-input type="number" v-model.number="dataForm.approvedReserves"><template slot="append">箱</template></el-input> + </el-form-item> + </el-col> + <el-col :span="11"> + <el-form-item label="核药量:" prop="nuclearDose" class="numInput"> + <el-input type="number" v-model.number="dataForm.nuclearDose"><template slot="append">kg</template></el-input> + </el-form-item> + </el-col> + </el-row> + </div> + <div class="part-title"> + <span>库房列表</span> + </div> + <el-divider></el-divider> + <tr> + <td class="w-12">序号</td> + <td class="w-20">库房名称</td> + <td>库房面积</td> + <td>有效仓储面积</td> + <td>核定储量(箱)</td> + <td>等级</td> + <td>核药量</td> + <td>操作</td> + </tr> + <tr v-for="(item,index) in dataForm.storehouseInfos" :key="index"> + <td class="w-12"> + {{ index + 1 }} + </td> + <td class="w-20"> + <el-input v-model="item.storehouseName"></el-input> + </td> + <td> + <el-input type="number" v-model.number="item.square"><template slot="append">㎡</template></el-input> + </td> + <td> + <el-input type="number" v-model.number="item.effectiveStorageSquare"><template slot="append">㎡</template></el-input> + </td> + <td> + <el-input type="number" v-model.number="item.approvedReserves"><template slot="append">箱</template></el-input> + </td> + <td> + <el-select v-model="item.storehouseLevel" clearable filterable> + <el-option label="1.1" :value="1.1"></el-option> + <el-option label="1.3" :value="1.3"></el-option> + </el-select> + </td> + <td> + <el-input type="number" v-model.number="item.nuclearDose"><template slot="append">kg</template></el-input> + </td> + <td> + <el-button type="danger" @click="delItem(item,index)">删除</el-button> + </td> + </tr> + <el-button type="primary" style="margin-top: 20px" @click="addItem()">新增仓库</el-button> + </el-form> + <br> + <span slot="footer" class="dialog-footer"> + <el-button @click="dialogVisible = false">取 消</el-button> + <el-button type="primary" @click="handleSubmit">保 存</el-button> + </span> + </el-dialog> +</template> + +<script> + import {mapGetters} from "vuex"; + import {getCityListData, getProvinceListData} from "../../../api/area"; + import {saveReserveInfo, getInfoById, editReserveInfo} from '../../../api/warehouse' + import Cookies from 'js-cookie' + export default { + name: "addStock", + data() { + return { + dialogVisible: false, + dialogTitle: '新增库区', + dataForm: { + id: null, + enterpriseId: null, + reserveName: '', + company: '', + reserveAddress: '', + province: '', + city: '', + area: '', + square: null, + effectiveStorageSquare: null, + approvedReserves: null, + nuclearDose: null, + storehouseInfos: [] + }, + listLoading: false, + provinceList:[], + cityList:[], + districtList:[], + dataFormRules:{ + reserveName:[{ required: true, message: '请填写库区名称', trigger: 'blur' }], + province:[{ required: true, message: '请选择所在区划', trigger: 'blur' }], + city:[{ required: true, message: '请选择所在区划', trigger: 'blur' }], + area:[{ required: true, message: '请选择所在区划', trigger: 'blur' }], + reserveAddress:[{ required: true, message: '请填写库区地址', trigger: 'blur' }], + square:[{ required: true, message: '请填写库区总面积', trigger: 'blur' }], + effectiveStorageSquare:[{ required: true, message: '请填写库区有效仓储面积', trigger: 'blur' }], + approvedReserves:[{ required: true, message: '请填写库区核定储量', trigger: 'blur' }], + nuclearDose:[{ required: true, message: '请填写库区核药量', trigger: 'blur' }] + }, + } + }, + created() { + const t = this + }, + computed: { + ...mapGetters([ + 'userType', + 'username' + ]) + }, + methods: { + open(type,data){ + this.getProvince() + if(type == 'add'){ + this.dataForm.company = Cookies.get('company') + this.dialogTitle = '新增库区' + }else{ + this.dialogTitle = '编辑库区' + getInfoById({id: data.topId}).then((res)=>{ + if(res.data.code == 200){ + if(res.data.result){ + for(let i in this.dataForm){ + if(this.isKey(i,res.data.result)){ + this.dataForm[i] = res.data.result[i] + } + } + } + this.dataForm['storehouseInfos'] = res.data.result.storehouseInfo.map((i)=>{ + const{reserveId,...data} = i + return data + }) + this.dataForm['company'] = data.enterpriseName + this.dataForm['enterpriseId'] = res.data.result.enterpriseId + } + }).catch((res)=>{ + this.$message.warning(res.data.message) + }) + } + this.dialogVisible = true + }, + isKey(key,obj){ + return key in obj + }, + + delItem(item,index){ + this.dataForm.storehouseInfos.splice(index,1); + }, + addItem(){ + const obj = { + storehouseName: '', + square: null, + effectiveStorageSquare: null, + approvedReserves: null, + storehouseLevel: null, + nuclearDose: null + } + this.dataForm.storehouseInfos.push(obj) + }, + async getProvince(){ + let res = await getProvinceListData() + if(res.data.code === "200"){ + this.provinceList = res.data.result.provinceList + } + }, + async changeArea(value) { + if (value === 'province') { + this.dataForm.city = '' + this.dataForm.area = '' + let res = await getCityListData({type:2, parenttype:1, parentname:this.dataForm.province}) + if (res.data.code === "200") { + this.cityList = res.data.result + } + } else if (value === 'city') { + this.dataForm.area = '' + let res = await getCityListData({type:3, parenttype:2, parentname:this.dataForm.city}) + if (res.data.code === "200") { + this.districtList = res.data.result + } + } + }, + handleSubmit(){ + if(this.dataForm.storehouseInfos == 0){ + this.$message.warning('库区应至少包含一间仓库') + return + } + if(this.dataForm.storehouseInfos.find(i=>i.storehouseName == ''|| i.square == null || i.effectiveStorageSquare == null || i.approvedReserves == null||i.storehouseLevel == null|| i.nuclearDose == null)){ + this.$message.warning('请完善部分仓库信息') + return + } + this.$refs.dataForm.validate(async (valid) => { + if (valid) { + if(this.dialogTitle == '新增库区'){ + const {company,id,enterpriseId,...data} = this.dataForm + const res = await saveReserveInfo(data) + if(res.data.code == 200){ + this.$message.success(res.data.message) + this.$refs.dataForm.resetFields() + this.$refs.dataForm.clearValidate() + this.$emit('refresh') + this.dialogVisible = false + }else{ + this.$message({ + type:'warning', + message: res.data.message + }) + } + }else{ + const {company,...data} = this.dataForm + const res = await editReserveInfo(data) + if(res.data.code == 200){ + this.$message.success(res.data.message) + this.$refs.dataForm.resetFields() + this.$refs.dataForm.clearValidate() + this.$emit('refresh') + this.dialogVisible = false + }else{ + this.$message({ + type:'warning', + message: res.data.message + }) + } + } + } + }) + + }, + reset(){ + this.$refs.dataForm.resetFields() + this.$refs.dataForm.clearValidate() + } + } + } +</script> + +<style lang="scss" scoped> + .part-title{ + font-size: 16px; + font-weight: bolder; + } + .selector{ + /deep/ .el-form-item__content{ + margin-left: 0 !important; + } + } + .editForm{ + .el-form-item{ + display: flex !important; + } + /deep/ .el-form-item__content{ + width: 100%; + margin-left: 0 !important; + } + } + + .numInput{ + /deep/ .el-input__inner{ + padding-right: 0; + } + } + tr{ + display: flex; + td{ + flex: 1; + display: flex; + justify-content: center; + padding: 5px; + align-items: center; + } + .w-12{ + flex: 0.5; + } + .w-20{ + flex: 2; + } + } +</style> diff --git a/src/views/warehouse/components/deliverUsage.vue b/src/views/warehouse/components/deliverUsage.vue new file mode 100644 index 0000000..f81e955 --- /dev/null +++ b/src/views/warehouse/components/deliverUsage.vue @@ -0,0 +1,139 @@ +<template> + <el-dialog + :visible.sync="deliverDialog" + :close-on-click-modal="false" + width="50%" + :append-to-body="true" + :title=stockName + center + size="medium" + > + <div class="app-container"> + <div class="upTitle"> + 请勾选或取消勾选允许使用该仓库的批发企业,您允许使用的企业可将货物入库到该仓库。 + </div> + <div class="table_content"> + <el-checkbox-group v-model="authorityCorts" @change="changeData"> + <el-checkbox v-for="item in companyList" :key="item.enterpriseId" :label="item.enterpriseId" :disabled="item.enterpriseAuthority == 1? true: false" border style="display: block"> + {{item.enterpriseName}} + </el-checkbox> + </el-checkbox-group> + </div> + </div> + <span slot="footer" class="dialog-footer"> + <el-button @click="deliverDialog = false">取 消</el-button> + <el-button type="primary" @click="handleSubmit()">提 交</el-button> + </span> + </el-dialog> +</template> + +<script> + import {computePageCount} from "@/utils"; + import {listStockhouseEnterpriseUserInfo,editEnterpriseUserAuthority} from "../../../api/warehouse"; + + export default { + name: "deliverUsage", + components: {}, + data(){ + return{ + tableStatus: true, + tableKey:'', + stockName: '', + listLoading:false, + companyList:[], + authorityCorts: [], + deliverDialog:false, + reserveId: null, + storehouseId: null, + submitForm: { + addEnterprises: [], + addStatus: false, + deleteEnterprises: [], + deleteStatus: false + } + } + }, + created() { + const t = this + }, + methods:{ + open(data){ + this.submitForm = { + addEnterprises: [], + addStatus: false, + deleteEnterprises: [], + deleteStatus: false + } + this.reserveId = data.topId + this.storehouseId = data.id + listStockhouseEnterpriseUserInfo({id: data.id}).then((res)=>{ + this.stockName = '仓库【'+ data.storehouseName + '】使用权分配' + if(res.data.code == 200){ + this.companyList = res.data.result.enterpriseUserAuthorityInfo + this.authorityCorts = this.companyList.filter(item=>item.enterpriseAuthority == 1 || item.enterpriseAuthority == 2).map(i=>{return i.enterpriseId}) + }else{ + this.$message.warning(res.data.message) + } + this.deliverDialog = true + }).catch(()=>{ + this.$message.warning('数据获取失败') + }) + }, + changeData(value){ + console.log(value,'val') + }, + async handleSubmit(){ + const originList = this.companyList.filter(i=>i.enterpriseAuthority == 1 || i.enterpriseAuthority==2) + const companyIds = originList.map(i=>i.enterpriseId) + const addedElementsSet = new Set(this.authorityCorts.filter(element => !companyIds.includes(element))) + const removedElementsSet = new Set(companyIds.filter(element => !this.authorityCorts.includes(element))) + const addedElements = Array.from(addedElementsSet) + const removedElements = Array.from(removedElementsSet) + if(addedElements.length>0){ + this.submitForm.addStatus = true + this.submitForm.addEnterprises = addedElements.map((i)=>{ + return { + enterpriseId: i, + reserveId: this.reserveId, + storehouseId: this.storehouseId + } + }) + } + if(removedElements.length>0){ + this.submitForm.deleteStatus = true + for(let i of this.companyList){ + if(removedElements.find(item=>item == i.enterpriseId)){ + this.submitForm.deleteEnterprises.push({ + id: i.id?i.id:null, + enterpriseId: i.enterpriseId, + reserveId: this.reserveId, + storehouseId: this.storehouseId + }) + } + } + } + const res = await editEnterpriseUserAuthority(this.submitForm) + if(res.data.code == 200){ + this.$message.success('仓库使用权修改成功') + }else{ + this.$message.warning(res.data.message) + } + this.deliverDialog = false + this.$emit('refresh') + } + } + } +</script> + +<style lang="scss" scoped> + .upTitle{ + font-size: 16px; + margin-bottom: 20px; + } + /deep/ .el-checkbox{ + width: 80%; + margin-left: 0 !important; + margin-right: 0 !important; + margin-bottom: 10px !important; + } +</style> diff --git a/src/views/warehouse/components/editStock.vue b/src/views/warehouse/components/editStock.vue new file mode 100644 index 0000000..481be5b --- /dev/null +++ b/src/views/warehouse/components/editStock.vue @@ -0,0 +1,146 @@ +<template> + <el-dialog :visible.sync="editDialogVisible" :modal-append-to-body="false" :close-on-click-modal="false" title="批发企业盘库(单位:箱)" center + width="30%"> + <el-form :model="stockInfo" label-width="140px" class="editForm"> + <el-form-item label="企业名称:"><el-input readonly v-model="stockInfo.enterpriseName"/></el-form-item> + <el-form-item label="当前库区:"><el-input readonly v-model="stockInfo.reserveName"/></el-form-item> + <el-form-item label="当前库房:"><el-input readonly v-model="stockInfo.storehouseName"/></el-form-item> + <el-form-item label="当前总库存:"><el-input readonly v-model="stockInfo.totalInventory"/></el-form-item> + </el-form> + <el-divider></el-divider> + <el-form ref="editForm" :rules="editFormRules" :model="editForm" label-width="140px" class="editForm"> + <el-form-item label="爆竹类:" prop="firecracker" class="numInput"> + <el-input type="number" v-model.number="editForm.firecracker"/> + </el-form-item> + <el-form-item label="喷花类:" prop="spray" class="numInput"> + <el-input type="number" v-model.number="editForm.spray"/> + </el-form-item> + <el-form-item label="旋转类:" prop="rotation" class="numInput"> + <el-input type="number" v-model.number="editForm.rotation"/> + </el-form-item> + <el-form-item label="吐珠类:" prop="bead" class="numInput"> + <el-input type="number" v-model.number="editForm.bead"/> + </el-form-item> + <el-form-item label="玩具类:" prop="toy" class="numInput"> + <el-input type="number" v-model.number="editForm.toy"/> + </el-form-item> + <el-form-item label="组合类:" prop="combined" class="numInput"> + <el-input type="number" v-model.number="editForm.combined"/> + </el-form-item> + </el-form> + <span slot="footer" class="dialog-footer"> + <el-button @click="editDialogVisible = false">取 消</el-button> + <el-button type="primary" @click="handleUpdate()">完 成</el-button> + </span> + </el-dialog> +</template> + +<script> + import {mapGetters} from "vuex"; + import {getStorehouseData, updateStorehouseData} from '../../../api/warehouse' + export default { + name: "editStock", + data() { + return { + editDialogVisible: false, + stockInfo:{ + enterpriseName: '', + reserveName: '', + storehouseName: '', + totalInventory: null + }, + editForm: { + id: null, + enterpriseId: null, + storehouseId: 0, + bead: 0, + combined: 0, + firecracker: 0, + rotation: 0, + spray: 0, + toy: 0 + }, + listLoading: false, + editFormRules:{ + firecracker:[{ required: true, message: '请填写数量', trigger: 'blur'}], + spray:[{ required: true, message: '请填写数量', trigger: 'blur'}], + rotation:[{ required: true, message: '请填写数量', trigger: 'blur'}], + bead:[{ required: true, message: '请填写数量', trigger: 'blur'}], + toy:[{ required: true, message: '请填写数量', trigger: 'blur'}], + combined:[{ required: true, message: '请填写数量', trigger: 'blur'}] + } + } + }, + created() { + const t = this + }, + computed: { + ...mapGetters([ + 'userType', + 'username' + ]) + }, + methods: { + open(data){ + this.editDialogVisible = true + this.stockInfo.enterpriseName = data.enterpriseName + this.stockInfo.reserveName = data.reserveName + this.stockInfo.storehouseName = data.storehouseName + this.stockInfo.totalInventory = data.totalInventory + getStorehouseData({id: data.id}).then((res)=>{ + if(res.data.code == 200){ + this.editForm = res.data.result + this.editForm['id'] = data.topId + this.editForm['enterpriseId'] = data.enterpriseUserId + this.editForm['storehouseId'] = data.id + }else{ + this.$message.warning(res.data.message) + } + }).catch(()=>{ + this.$message.warning('数据获取失败') + }) + }, + handleUpdate(){ + this.$refs.editForm.validate(async (valid) => { + if (valid) { + const res = await updateStorehouseData(this.editForm) + if(res.data.code == 200){ + this.$message.success('盘库提交成功') + + }else{ + this.$message.warning(res.data.message) + } + this.editDialogVisible = false + } + }) + } + } + } +</script> + +<style lang="scss" scoped> + .part-title{ + font-size: 16px; + font-weight: bolder; + } + .selector{ + /deep/ .el-form-item__content{ + margin-left: 0 !important; + } + } + .editForm{ + .el-form-item{ + display: flex !important; + } + /deep/ .el-form-item__content{ + width: 100%; + margin-left: 0 !important; + } + } + + .numInput{ + /deep/ .el-input__inner{ + padding-right: 0; + } + } +</style> diff --git a/src/views/warehouse/components/enterpriseStock.vue b/src/views/warehouse/components/enterpriseStock.vue new file mode 100644 index 0000000..fdd9e13 --- /dev/null +++ b/src/views/warehouse/components/enterpriseStock.vue @@ -0,0 +1,103 @@ +<template> + <el-dialog + :visible.sync="dialogVisible" + width="70%" + :append-to-body="true" + :title="title" + > + <div class="app-container"> + <div class="table_content"> + <el-table + v-loading="listLoading" + :key="tableKey" + :data="listData" + border + fit + highlight-current-row + style="width: 100%;" + show-summary + > + <el-table-column label="企业名称" prop="enterpriseUser" align="center"> + </el-table-column> + <el-table-column label="总库存" prop="totalStock" align="center"> + </el-table-column> + <el-table-column label="爆竹类(箱)" prop="firecracker" align="center"> + </el-table-column> + <el-table-column label="喷花类(箱)" prop="spray" align="center"> + </el-table-column> + <el-table-column label="旋转类(箱)" prop="rotation" align="center"> + </el-table-column> + <el-table-column label="吐珠类(箱)" prop="bead" align="center"> + </el-table-column> + <el-table-column label="玩具类(箱)" prop="toy" align="center"> + </el-table-column> + <el-table-column label="组合烟花类(箱)" prop="combined" align="center"> + </el-table-column> + </el-table> + <br> +<!-- <el-pagination--> +<!-- v-show="recordTotal>0"--> +<!-- :current-page="currentPage"--> +<!-- :page-sizes="[10, 15]"--> +<!-- :page-size="pageSize"--> +<!-- :total="recordTotal"--> +<!-- layout="total, sizes, prev, pager, next, jumper"--> +<!-- background--> +<!-- style="float:right;"--> +<!-- @size-change="handleSizeChange"--> +<!-- @current-change="handleCurrentChange"--> +<!-- />--> +<!-- <br>--> + </div> + </div> + </el-dialog> +</template> + +<script> + import {computePageCount} from "@/utils"; + import {listStockDataByStorehouseId} from "../../../api/warehouse"; + + export default { + name: "index", + data(){ + return{ + title:'', + tableKey:'', + listLoading:false, + listData:[], + dialogVisible:false, + } + }, + components: {}, + methods:{ + open(data){ + this.getList(data.id || data.storehouseId) + this.dialogVisible = true + }, + async getList(id){ + this.listLoading = true + let res = await listStockDataByStorehouseId({id: id}) + if(res.data.code === "200"){ + this.listData = res.data.result.stockDataInfos + this.title = '库区:'+res.data.result.reserveName +' 仓库:'+ res.data.result.storehouseName + '各企业库存情况' + }else{ + this.$message({ + type:'warning', + message:res.data.message + }) + } + this.listLoading = false + } + } + } +</script> + +<style scoped> + .basic_search{ + display:inline-block; + } + .table_title{ + font-size: 18px; + margin-bottom: 20px; + } +</style> diff --git a/src/views/warehouse/components/recordDetail.vue b/src/views/warehouse/components/recordDetail.vue new file mode 100644 index 0000000..4bc9f83 --- /dev/null +++ b/src/views/warehouse/components/recordDetail.vue @@ -0,0 +1,162 @@ +<template> + <el-dialog :visible.sync="detailVisible" append-to-body :close-on-click-modal="false" :title="title" center + width="75%"> + <div class="app-container"> + <div class="table_content"> + <el-table + v-loading="listLoading" + :data="detailRecords" + border + fit + highlight-current-row + style="width: 100%;" + > + <el-table-column label="序号" type="index" align="center" width="60"/> + <el-table-column v-if="title == '出库详情'" label="产品名称" prop="itemname" align="center"></el-table-column> + <el-table-column v-if="title == '入库详情'" label="产品名称" prop="productname" align="center"></el-table-column> + <el-table-column label="产品包装码" prop="itemcode" align="center"></el-table-column> + <el-table-column label="类型" prop="type" align="center"></el-table-column> + <el-table-column label="规格" prop="specification" align="center"></el-table-column> + <el-table-column label="含药量" prop="explosivecontent" align="center"></el-table-column> + <el-table-column label="箱含量" prop="boxnumber" align="center"></el-table-column> + <el-table-column :label="title == '入库详情'?'入库数量':'出库数量'" prop="num" align="center"></el-table-column> + </el-table> + <el-pagination + v-show="recordTotal>0" + :current-page="currentPage" + :page-sizes="[10, 20, 30, 50]" + :page-size="pageSize" + :total="recordTotal" + layout="total, sizes, prev, pager, next, jumper" + background + style="float:right;" + @size-change="handleSizeChange" + @current-change="handleCurrentChange" + /> + </div> + </div> + </el-dialog> +</template> + +<script> + import {mapGetters} from "vuex"; + import {getInboundDetail, getOutboundDetail} from '../../../api/warehouse' + import Cookies from "_js-cookie@2.2.0@js-cookie"; + export default { + name: "recordDetail", + data() { + return { + detailVisible: false, + title: '', + stockInfo:{ + enterpriseName: '', + reserveName: '', + storehouseName: '', + totalInventory: null + }, + detailRecords: [], + listLoading: false, + pageSize: 10, + recordTotal: 0, + currentPage: 1, + listQuery: { + pageIndex: 1, + pageSize: 10, + filter: { + storehouseId: null, + code: '' + } + } + } + }, + created() { + const t = this + }, + computed: { + ...mapGetters([ + 'userType', + 'username' + ]) + }, + methods: { + open(type,data,storehouseId){ + this.detailRecords = [] + this.detailVisible = true + this.listQuery.filter.storehouseId = storehouseId + if(type=='out'){ + this.title = '出库详情' + this.listQuery.filter.code = data.ordercode + this.getOut() + }else{ + this.title = '入库详情' + this.listQuery.filter.code = data.code + this.getIn() + } + }, + + async getOut(){ + const res = await getOutboundDetail(this.listQuery) + if(res.data.code == 200){ + this.detailRecords = res.data.result.records + this.recordTotal = res.data.result.total + }else{ + this.$message.warning(res.data.message) + } + }, + + async getIn(){ + const res = await getInboundDetail(this.listQuery) + if(res.data.code == 200){ + this.detailRecords = res.data.result.records + this.recordTotal = res.data.result.total + }else{ + this.$message.warning(res.data.message) + } + }, + + handleSizeChange(val) { + this.listQuery.pageSize = val + if(this.title == '出库详情'){ + this.getOut() + }else{ + this.getIn() + } + }, + handleCurrentChange(val) { + this.listQuery.pageIndex = val + if(this.title == '出库详情'){ + this.getOut() + }else{ + this.getIn() + } + }, + } + } +</script> + +<style lang="scss" scoped> + .part-title{ + font-size: 16px; + font-weight: bolder; + } + .selector{ + /deep/ .el-form-item__content{ + margin-left: 0 !important; + } + } + .editForm{ + .el-form-item{ + display: flex !important; + } + /deep/ .el-form-item__content{ + width: 100%; + margin-left: 0 !important; + } + } + + .numInput{ + /deep/ .el-input__inner{ + padding-right: 0; + } + } +</style> diff --git a/src/views/warehouse/components/stockRecords.vue b/src/views/warehouse/components/stockRecords.vue new file mode 100644 index 0000000..7f1c350 --- /dev/null +++ b/src/views/warehouse/components/stockRecords.vue @@ -0,0 +1,261 @@ +<template> + <el-dialog + :visible.sync="recordDialog" + :close-on-click-modal="false" + width="75%" + :title="tableStatus?'仓库出库记录':'仓库入库记录'" + center + append-to-body + > + <div class="app-container"> + <div class="filter-container"> + <div style="display: flex;justify-content: space-between"> + <div class="basic_search" style="padding-top: 10px"> + <span style="font-size: 16px">在</span> + <el-date-picker + value-format="yyyy-MM-dd HH:mm:ss" + v-model="validTime" + type="datetimerange" + :default-time="['00:00:00','23:59:59']" + range-separator="至" + start-placeholder="开始日期" + end-placeholder="结束日期" + @change="updateTime" + > + </el-date-picker> +<!-- <span v-if="tableStatus" style="font-size: 16px">期间总计出库</span>--> +<!-- <span v-else style="font-size: 16px">期间总计入库</span>--> +<!-- <span style="font-size: 16px">2333</span>--> +<!-- <span style="font-size: 16px">箱</span>--> + </div> + <div class="basic_search" style="margin-right: 10px;padding-top: 10px"> + <el-radio-group v-model="tableStatus" @input="changeStatus"> + <el-radio-button :label="true">出库记录</el-radio-button> + <el-radio-button :label="false">入库记录</el-radio-button> + </el-radio-group> + </div> + </div> + </div> + <div class="table_content"> + <el-table + v-loading="listLoading" + :key="tableKey" + :data="stockRecords" + border + fit + highlight-current-row + style="width: 100%;" + v-if="tableStatus" + > + <el-table-column label="序号" type="index" align="center" width="60"/> + <el-table-column label="出库单号" prop="ordercode" align="center"></el-table-column> + <el-table-column label="出库企业" prop="shop" align="center"></el-table-column> + <el-table-column label="创建时间" prop="createat" align="center"></el-table-column> + <el-table-column label="运输证号" prop="transportcert" align="center"></el-table-column> + <el-table-column label="数量(箱)" prop="realboxnum" align="center"></el-table-column> + <el-table-column prop="type" align="center"> + <template slot-scope="scope"> + <span type="text">{{scope.row.type == 1? '常规出库':scope.row.type == 2? '快速出库':scope.row.type == 3? '退货出库':'--'}}</span> + </template> + </el-table-column> + <el-table-column label="操作" align="center" width="120" class-name="small-padding fixed-width" fixed="right"> + <template slot-scope="scope"> + <el-button type="text" @click="showDetails('out',scope.row)">查看</el-button> + </template> + </el-table-column> + </el-table> + <el-table + v-loading="listLoading" + :key="tableKey" + :data="stockRecords" + border + fit + highlight-current-row + style="width: 100%;" + v-if="!tableStatus" + > + <el-table-column label="序号" type="index" align="center" width="60"/> + <el-table-column label="入库单号" prop="code" align="center"></el-table-column> + <el-table-column label="入库企业" prop="unit" align="center"></el-table-column> + <el-table-column label="创建时间" prop="createddate" align="center"></el-table-column> + <el-table-column label="运输证号" prop="transportcert" align="center"></el-table-column> + <el-table-column label="数量(箱)" prop="boxnum" align="center"></el-table-column> + <el-table-column :label="tableStatus?'出库类型':'入库类型'" prop="type" align="center"> + <template slot-scope="scope"> + <span type="text">{{scope.row.type == 1? '常规入库':scope.row.type == 2? '快速入库':scope.row.type == 3? '退货入库':'--'}}</span> + </template> + </el-table-column> + <el-table-column label="操作" align="center" width="120" class-name="small-padding fixed-width" fixed="right"> + <template slot-scope="scope"> + <el-button type="text" @click="showDetails('in',scope.row)">查看</el-button> + </template> + </el-table-column> + </el-table> + <el-pagination + v-show="recordTotal>0" + :current-page="currentPage" + :page-sizes="[10, 20, 30, 50]" + :page-size="pageSize" + :total="recordTotal" + layout="total, sizes, prev, pager, next, jumper" + background + style="float:right;" + @size-change="handleSizeChange" + @current-change="handleCurrentChange" + /> + <record-detail ref="detailRef"></record-detail> + </div> + </div> + </el-dialog> +</template> + +<script> + import {computePageCount} from "@/utils"; + import {getInboundQuery, getOutboundQuery} from "../../../api/warehouse" + import recordDetail from "./recordDetail"; + import Cookies from "_js-cookie@2.2.0@js-cookie"; + + export default { + name: "stockRecords", + components: {recordDetail}, + data(){ + return{ + tableStatus: true, + tableKey:'', + listLoading:false, + pageSize: 10, + recordTotal: 0, + currentPage: 1, + validTime: ['', ''], + stockRecords:[], + recordDialog:false, + listQuery: { + pageIndex: 1, + pageSize: 10, + filter: { + storehouseId: null, + starttime: '', + endtime: '' + } + }, + } + }, + created() { + const t = this + }, + methods:{ + open(row){ + this.listQuery.pageIndex = 1 + this.listQuery.filter.storehouseId = row.storehouseId + this.initValidTime() + if(this.tableStatus){ + this.getOutbound() + }else{ + this.getInbound() + } + this.recordDialog = true + }, + + async getOutbound(){ + const res = await getOutboundQuery(this.listQuery) + if(res.data.code == 200){ + this.stockRecords = res.data.result.records + this.recordTotal = res.data.result.total + }else{ + this.$message({ + type:'warning', + message: res.data.message + }) + } + }, + + async getInbound(){ + const res = await getInboundQuery(this.listQuery) + if(res.data.code == 200){ + this.stockRecords = res.data.result.records + this.recordTotal = res.data.result.total + }else{ + this.$message({ + type:'warning', + message: res.data.message + }) + } + }, + + initValidTime() { + const end = new Date(); + if (end.getDate() - 1 === 0) { + this.validTime[0] = [end.getFullYear(), end.getMonth()-1, this.returnDay(end.getMonth()-1, end.getFullYear())].join("-") + " 00:00:00"; + this.validTime[1] = [end.getFullYear(), end.getMonth(), this.returnDay(end.getMonth(), end.getFullYear())].join("-") + " 23:59:59"; + } else if (end.getDate() - 1 === 0 && end.getMonth() === 0) { + this.validTime[0] = [end.getFullYear() - 1, 11, 30].join("-") + " 00:00:00"; + this.validTime[1] = [end.getFullYear() - 1, 12, 31].join("-") + " 23:59:59"; + } else { + this.validTime[0] = [end.getFullYear(), end.getMonth(), end.getDate() - 1].join("-") + " 00:00:00"; + this.validTime[1] = [end.getFullYear(), end.getMonth() + 1, end.getDate() - 1].join("-") + " 23:59:59"; + } + this.listQuery.filter.starttime = this.validTime[0] + this.listQuery.filter.endtime = this.validTime[1] + }, + returnDay(value, year) { + if (value === 1 || value === 3 || value === 5 || value === 7 || value === 8 || value === 10 || value === 12) { + return 31 + } else if (value === 2) { + if (year % 4 === 0) { + return 29 + } else { + return 28 + } + } else { + return 30 + } + }, + changeStatus(val){ + this.listQuery.pageIndex = 1 + if(val == true){ + this.getOutbound() + }else{ + this.getInbound() + } + }, + + updateTime(){ + this.listQuery.pageIndex = 1 + this.listQuery.filter.starttime = this.validTime[0] + this.listQuery.filter.endtime = this.validTime[1] + if(this.tableStatus == true){ + this.getOutbound() + }else{ + this.getInbound() + } + }, + + handleSizeChange(val) { + this.listQuery.pageSize = val + if(this.tableStatus == true){ + this.getOutbound() + }else{ + this.getInbound() + } + }, + handleCurrentChange(val) { + this.listQuery.pageIndex = val + if(this.tableStatus == true){ + this.getOutbound() + }else{ + this.getInbound() + } + }, + + showDetails(type,row){ + this.$refs.detailRef.open(type,row,this.listQuery.filter.storehouseId) + } + } + } +</script> + +<style scoped> + .basic_search{ + display:inline-block; + } +</style> diff --git a/src/views/warehouse/stockAnalyse.vue b/src/views/warehouse/stockAnalyse.vue new file mode 100644 index 0000000..9cc28ed --- /dev/null +++ b/src/views/warehouse/stockAnalyse.vue @@ -0,0 +1,425 @@ +<template> + <div class="app-container"> + <div class="filter-container"> + <div style="display: block;"> +<!-- <div class="basic_search">--> +<!-- <span>区域:</span>--> +<!-- <el-select v-model="listQuery.province" clearable filterable @change="changeArea('province')">--> +<!-- <el-option--> +<!-- v-for="item in provinceList"--> +<!-- :key="item.id"--> +<!-- :label="item.name"--> +<!-- :value="item.name"--> +<!-- >--> +<!-- </el-option>--> +<!-- </el-select>--> +<!-- </div>--> +<!-- <div class="basic_search">--> +<!-- <el-select v-model="listQuery.city" prop="city" clearable filterable @change="changeArea('city')">--> +<!-- <el-option--> +<!-- v-for="item in cityList"--> +<!-- :key="item.id"--> +<!-- :label="item.name"--> +<!-- :value="item.name"--> +<!-- >--> +<!-- </el-option>--> +<!-- </el-select>--> +<!-- </div>--> +<!-- <div class="basic_search">--> +<!-- <el-select v-model="listQuery.area" clearable filterable @change="changeArea('area')">--> +<!-- <el-option--> +<!-- v-for="item in districtList"--> +<!-- :key="item.id"--> +<!-- :label="item.name"--> +<!-- :value="item.name"--> +<!-- >--> +<!-- </el-option>--> +<!-- </el-select>--> +<!-- </div>--> + <div class="basic_search"> + <span>企业名称:</span> + <el-input filterable clearable v-model="listQuery.enterpriseName" style="width:200px"> + </el-input> + </div> +<!-- <div class="basic_search">--> +<!-- <span>库区名称:</span>--> +<!-- <el-input filterable clearable v-model="listQuery.reserveName" style="width:200px">--> +<!-- </el-input>--> +<!-- </div>--> + <div class="basic_search" style="margin-right: 10px"> + <el-button style="margin-left: 10px;" type="primary" @click="reset()">重置</el-button> + <el-button style="margin-left: 10px;" type="primary" icon="el-icon-search" @click="searchData()">查询</el-button> + </div> + </div> + </div> + <div class="table_content"> + <el-table + v-loading="listLoading" + :data="stateStockData" + :span-method="objectSpanMethod" + :cell-class-name="tableRowClassName" @cell-mouse-leave="cellMouseLeave" @cell-mouse-enter="cellMouseEnter" + border + :stripe="false" + style="width: 100%;" + > + <el-table-column label="企业名称" prop="gName" align="center" fixed="left"></el-table-column> + <el-table-column label="企业总库存" prop="gStock" align="center" fixed="left"></el-table-column> + <el-table-column label="库区" prop="reserveName" align="center"> + <template slot-scope="scope"> + <span v-if="scope.row.reserveName =='合计'">{{scope.row.reserveName}}</span> + <el-link v-else type="primary" @click="openStock('edit',scope.row)">{{scope.row.reserveName}}</el-link> + </template> + </el-table-column> + <el-table-column label="库区总库存" prop="gName" align="center"></el-table-column> + <el-table-column label="库区面积/㎡" prop="topSquare" align="center"></el-table-column> + <el-table-column label="有效存储总面积/㎡" prop="topStorageSquare" align="center"></el-table-column> +<!-- <el-table-column label="总库容量" prop="topApprovedReserves" align="center"></el-table-column>--> + <el-table-column label="总核药量" prop="topNuclearDose" align="center"></el-table-column> + <el-table-column label="库房名称" prop="storehouseName" align="center"> + <template slot-scope="scope"> + <span v-if="scope.row.storehouseName == '本库区合计'||scope.row.storehouseName == '合计'">{{scope.row.storehouseName}}</span> + <el-link v-else type="primary" @click="openRecord(scope.row)">{{scope.row.storehouseName}}</el-link> + </template> + </el-table-column> + <el-table-column label="库房面积/㎡" prop="square" align="center"></el-table-column> + <el-table-column label="有效存储面积/㎡" prop="storageSquare" align="center"></el-table-column> + <el-table-column label="库容量/箱" prop="approvedReserves" align="center"></el-table-column> + <el-table-column label="核药量/kg" prop="nuclearDose" align="center"></el-table-column> + <el-table-column label="当前总库存" prop="totalStock" align="center"></el-table-column> + <el-table-column label="爆竹类(箱)" prop="firecracker" align="center"></el-table-column> + <el-table-column label="喷花类(箱)" prop="spray" align="center"></el-table-column> + <el-table-column label="旋转类(箱)" prop="rotation" align="center"></el-table-column> + <el-table-column label="吐珠类(箱)" prop="bead" align="center"></el-table-column> + <el-table-column label="玩具类(箱)" prop="toy" align="center"></el-table-column> + <el-table-column label="组合烟花类(箱)" prop="combined" align="center"></el-table-column> + <el-table-column label="是否超量" prop="overShoot" align="center"> + <template slot-scope="scope"> + <span>{{scope.row.overShoot ==0?'否':scope.row.overShoot ==1?'是':'--'}}</span> + </template> + </el-table-column> + <el-table-column label="是否允许盘库" prop="inventoryStatus" align="center"> + <template slot-scope="scope"> + <span v-if="scope.row.inventoryStatus == null">--</span> + <el-switch :disabled="disable" v-else v-model="scope.row.inventoryStatus" :active-value="1" :inactive-value="0" @change="changeStatus($event,scope.row)"></el-switch> + </template> + </el-table-column> + <el-table-column label="操作" align="center" width="120" class-name="small-padding fixed-width" fixed="right"> + <template slot-scope="scope" v-if="scope.row.storehouseName !== '本库区合计' && scope.row.storehouseName !== '合计'"> + <el-button type="text" @click="showEnterprises(scope.row)">查看详情</el-button> + <el-button type="text" @click="delData(scope.row)">删除</el-button> + </template> + </el-table-column> + </el-table> + <br> + <add-stock ref="addStock" @refresh="getList"></add-stock> + <stock-records ref="stockRecords"></stock-records> + <enterprise-stock ref="enterStock"></enterprise-stock> + </div> + </div> +</template> + +<script> +import {computePageCount} from "../../utils"; +import {delStore, getReservesForUser, getSupervisionStatistics, changeInventory, getAnalysis} from "../../api/warehouse" +import addStock from "./components/addStock" +import stockRecords from "./components/stockRecords" +import enterpriseStock from "./components/enterpriseStock" +import Cookies from "js-cookie" +import {getCityListData, getProvinceListData} from "../../api/area"; +import {MessageBox} from "_element-ui@2.14.1@element-ui"; +export default { + name: "stockAnalyse", + components: {addStock,stockRecords, enterpriseStock}, + data() { + return { + tableKey: '', + disable: false, + provinceList: [], + cityList: [], + districtList: [], + Cookies: Cookies, + listLoading: false, + stateStockData: [], + rowIndex: '-1', + OrderIndexArr: [], + hoverOrderArr: [], + listQuery: { + enterpriseName: '', + }, + } + }, + created() { + const t = this + t.getList() + t.getProvince() + const roles = JSON.parse(Cookies.get('roles')) + if(roles.find(i=>i.name == '管理员'|| i.name == '监管部门')){ + this.disable = false + }else{ + this.disable = true + } + }, + mounted() { + }, + watch: {}, + methods: { + async getList(){ + const res = await getAnalysis(this.listQuery) + if(res.data.code == 200){ + this.stateStockData=[] + const tableData = res.data.result.enterprises + let gData = [] + if(Array.isArray(tableData)){ + tableData.map(item=>{ + if(Array.isArray(item.reserves)){ + item.reserves.map((subRes, subIndex)=>{ + let content = {} + content = subRes + content['gId'] = item.enterpriseId + content['gStock'] = item.enterpriseStock + content['gName'] = item.enterpriseName + // 重点!赋值合并的行数数值,只需要取子循环的第一个数赋值待合并的行数即可 + if(subIndex == 0){ + content['gNum'] = item.reserves.length + } + gData.push(content) + }) + } + }) + } + console.log(gData,'gData') + if(Array.isArray(gData)){ + gData.map(item=>{ + if(Array.isArray(item.storehouse.warehouses) && item.storehouse.whTotal){ + let obj = { + approvedReserves: item.storehouse.whTotal.wtotalApprovedReserves, + bead: item.storehouse.whTotal.wtotalBead, + combined: item.storehouse.whTotal.wtotalCombined, + firecracker: item.storehouse.whTotal.wtotalFirecracker, + inventoryStatus: null, + nuclearDose: item.storehouse.whTotal.wtotalNuclearDose, + overShoot: null, + rotation: item.storehouse.whTotal.wtotalRotation, + spray: item.storehouse.whTotal.wtotalSpray, + square: item.storehouse.whTotal.wtotalSquare, + storageSquare: item.storehouse.whTotal.wtotalStorageSquare, + storehouseId: null, + storehouseName: item.storehouse.whTotal.wname, + totalStock: item.storehouse.whTotal.wtotalStock, + toy: item.storehouse.whTotal.wtotalToy, + } + item.storehouse.warehouses.push(obj) + item.storehouse.warehouses.map((subRes, subIndex)=>{ + let content2 = {} + content2 = subRes + content2['gId'] = item.enterpriseId + content2['gStock'] = item.gStock + content2['gName'] = item.gName + content2['gNum'] = item.gNum || null + content2['topId'] = item.reserveId + content2['reserveName'] = item.reserveName + content2['topSquare'] = item.square + content2['topStorageSquare'] = item.storageSquare + content2['topApprovedReserves'] = item.approvedReserves + content2['topNuclearDose'] = item.nuclearDose + // 重点!赋值合并的行数数值,只需要取子循环的第一个数赋值待合并的行数即可 + if(subIndex == 0){ + content2['rowNum'] = item.storehouse.warehouses.length + } + this.stateStockData.push(content2) + }) + } + }) + } + if(res.data.result.total){ + const total = res.data.result.total + let totalObj = { + topId: null, + reserveName: total.name, + gId: null, + gName: total.name, + gStock: total.enterpriseTotalStock, + storehouseName: total.name, + gNum: 1, + rowNum: 1, + topSquare: total.resTotalSquare, + topStorageSquare: total.resTotalStorageSquare, + topApprovedReserves: total.resTotalApprovedReserves, + topNuclearDose: total.resTotalNuclearDose, + firecracker: total.totalFirecracker, + rotation: total.totalRotation, + spray: total.totalSpray, + totalStock: total.totalStock, + toy: total.totalToy, + bead: total.totalBead, + combined: total.totalCombined, + approvedReserves: total.whTotalApprovedReserves, + square: total.whTotalSquare, + storageSquare: total.whTotalStorageSquare, + nuclearDose: total.whTotalNuclearDose, + } + this.stateStockData.push(totalObj) + } + }else{ + this.$message({ + type:'warning', + message: res.data.message + }) + } + }, + + searchData(){ + this.getList() + }, + + reset(){ + this.listQuery={ + enterpriseName: '' + } + this.getList() + }, + + showEnterprises(row){ + const t = this + t.$refs.enterStock.open(row) + }, + + openStock(type,data){ + const t = this + t.$refs.addStock.open(type,data) + }, + + openRecord(row){ + const t = this + t.$refs.stockRecords.open(row) + }, + + delData(row){ + const t = this + MessageBox.confirm('确定删除库房名为:' + row.storehouseName + '的信息', '确定删除', { + confirmButtonText: '确定', + cancelButtonText: '取消', + type: 'warning' + }).then(() => { + t.deleteStore(row.storehouseId) + }).catch(() => { + console.log('已取消删除') + }) + }, + + async deleteStore(id){ + const res = await delStore({id: id}) + if(res.data.code == 200){ + this.$message({ + type:'success', + message: '删除成功' + }) + }else{ + this.$message({ + type:'warning', + message: res.data.message + }) + } + }, + + async getProvince(){ + let res = await getProvinceListData() + if(res.data.code === "200"){ + this.provinceList = res.data.result.provinceList + } + }, + + changeStatus(val,row){ + MessageBox.confirm('确定删除库房名为:' + row.storehouseName + '的盘库许可状态', '确定修改', { + confirmButtonText: '确定', + cancelButtonText: '取消', + type: 'warning' + }).then(async () => { + const res = await changeInventory({inventoryStatus: val,id: row.storehouseId}) + if(res.data.code == 200){ + this.$message({ + type:'success', + message: '修改成功' + }) + }else{ + this.$message({ + type:'warning', + message: res.data.message + }) + } + }).catch(() => { + this.getList() + }) + }, + + async changeArea(value) { + if (value === 'province') { + this.listQuery.city = '' + this.listQuery.area = '' + let res = await getCityListData({type:2, parenttype:1, parentname:this.listQuery.province}) + if (res.data.code === "200") { + this.cityList = res.data.result + } + } else if (value === 'city') { + this.listQuery.area = '' + let res = await getCityListData({type:3, parenttype:2, parentname:this.listQuery.city}) + if (res.data.code === "200") { + this.districtList = res.data.result + } + } + }, + + objectSpanMethod({ row, column, rowIndex, columnIndex }) { + // columnIndex 代表列数,从0开始计数,我们要合并的字段属于第一列,取0 + if(columnIndex ==0 || columnIndex ==1){ + return { + rowspan: row.gNum * row.rowNum, // 待合并行数 -- 合并的行数长度就等于之前赋值的子数据的长度;未赋值的即表示0,不显示 + colspan: row.gNum>0?1:0 // 待合并列数 -- 合并的列数自身占一列,被合并的要返回0,表示不显示 + }; + } + if(columnIndex >1 && columnIndex < 7){ + return { + rowspan: row.rowNum, // 待合并行数 -- 合并的行数长度就等于之前赋值的子数据的长度;未赋值的即表示0,不显示 + colspan: row.rowNum>0?1:0 // 待合并列数 -- 合并的列数自身占一列,被合并的要返回0,表示不显示 + }; + } + }, + + tableRowClassName({row,rowIndex}) { + let arr = this.hoverOrderArr + for (let i = 0; i < arr.length; i++) { + if (rowIndex == arr[i]) { + return 'hovered-row' + } + } + }, + + cellMouseEnter(row, column, cell, event) { + this.rowIndex = row.rowIndex; + this.hoverOrderArr = []; + this.OrderIndexArr.forEach(element => { + if (element.indexOf(this.rowIndex) >= 0) { + this.hoverOrderArr = element + } + }) + }, + cellMouseLeave(row, column, cell, event) { + this.rowIndex = '-1' + this.hoverOrderArr = []; + }, + }, +} +</script> +<style> +.el-table .hovered-row { + background: #f5f7fa; +} +</style> +<style scoped> +.basic_search { + display: inline-block; +} +/deep/.el-table .el-table__body-wrapper table tr:nth-child(2n) td{ + background: #fff !important; +} +</style> diff --git a/src/views/warehouse/stockManage.vue b/src/views/warehouse/stockManage.vue new file mode 100644 index 0000000..f64983c --- /dev/null +++ b/src/views/warehouse/stockManage.vue @@ -0,0 +1,218 @@ +<template> + <div class="app-container"> + <div class="filter-container"> + <div style="display: block;"> + <div class="basic_search" style="margin-right: 10px;padding-top: 10px"> + <el-button style="margin-left: 10px;" type="primary" @click="openStock('add',{})">创建库区</el-button> + </div> + </div> + </div> + <div class="table_content"> + <el-table + v-loading="listLoading" + :data="stateStockData" + :span-method="objectSpanMethod" + :cell-class-name="tableRowClassName" @cell-mouse-leave="cellMouseLeave" @cell-mouse-enter="cellMouseEnter" + border + :stripe="false" + style="width: 100%;" + > + <el-table-column label="库区名称" prop="reserveName" align="center" fixed="left"> + <template slot-scope="scope"> + <el-link type="primary" @click="openStock('edit',scope.row)">{{scope.row.reserveName}}</el-link> + </template> + </el-table-column> + <el-table-column label="区域" align="center" fixed="left"> + <template slot-scope="scope"> + {{ scope.row.province }}/{{scope.row.city}}/{{scope.row.area}} + </template> + </el-table-column> + <el-table-column label="所属企业" prop="enterpriseName" align="center"></el-table-column> + <el-table-column label="地址" prop="reserveAddress" align="center"></el-table-column> + <el-table-column label="库区面积/㎡" prop="topSquare" align="center"></el-table-column> + <el-table-column label="有效存储总面积/㎡" prop="topEffectiveStorageSquare" align="center"></el-table-column> + <el-table-column label="核药量/kg" prop="topNuclearDose" align="center"></el-table-column> + <el-table-column label="库房名称" prop="storehouseName" align="center"> + <template slot-scope="scope"> + <el-link type="primary" @click="openRecord(scope.row)">{{scope.row.storehouseName}}</el-link> + </template> + </el-table-column> + <el-table-column label="库房面积/㎡" prop="square" align="center"></el-table-column> + <el-table-column label="有效存储面积/㎡" prop="effectiveStorageSquare" align="center"></el-table-column> + <el-table-column label="等级" prop="storehouseLevel" align="center"></el-table-column> + <el-table-column label="库容量/箱" prop="approvedReserves" align="center"></el-table-column> + <el-table-column label="核药量/kg" prop="nuclearDose" align="center"></el-table-column> + <el-table-column label="当前总库存" prop="totalInventory" align="center"></el-table-column> + <el-table-column label="本公司库存" prop="inventoryOfTheCompany" align="center"></el-table-column> + <el-table-column label="爆竹类(箱)" prop="firecracker" align="center"></el-table-column> + <el-table-column label="喷花类(箱)" prop="spray" align="center"></el-table-column> + <el-table-column label="旋转类(箱)" prop="rotation" align="center"></el-table-column> + <el-table-column label="吐珠类(箱)" prop="bead" align="center"></el-table-column> + <el-table-column label="玩具类(箱)" prop="toy" align="center"></el-table-column> + <el-table-column label="组合烟花类(箱)" prop="combined" align="center"></el-table-column> + <el-table-column label="操作" align="center" width="120" class-name="small-padding fixed-width" fixed="right"> + <template slot-scope="scope"> + <el-button type="text" @click="showEnterprises(scope.row)">存货企业</el-button> + <el-button type="text" @click="deliverUsage(scope.row)">分配使用权</el-button> + </template> + </el-table-column> + <el-table-column label="是否允许盘库" align="center" width="120" class-name="small-padding fixed-width" fixed="right"> + <template slot-scope="scope"> + <span type="text" v-if="scope.row.inventoryStatus == 1">否</span> + <el-button v-if="scope.row.inventoryStatus == 0" type="text" @click="stockEdit(scope.row)">允许盘库</el-button> + </template> + </el-table-column> + </el-table> + <br> + + <add-stock ref="addStock" @refresh="getList"></add-stock> + <deliver-usage ref="deliverUsage" @refresh="getList"></deliver-usage> + <stock-records ref="stockRecords"></stock-records> + <edit-stock ref="editStock"></edit-stock> + <enterprise-stock ref="enterStock"></enterprise-stock> + </div> + </div> +</template> + +<script> +import {computePageCount} from "../../utils"; +import {getReservesForUser, getStorehouseDataByUser} from "../../api/warehouse" +import addStock from "./components/addStock" +import deliverUsage from "./components/deliverUsage" +import stockRecords from "./components/stockRecords" +import editStock from "./components/editStock" +import enterpriseStock from "./components/enterpriseStock" +import Cookies from "js-cookie" +export default { + name: "stockManage", + components: {enterpriseStock,addStock,deliverUsage,stockRecords,editStock}, + data() { + return { + tableKey: '', + provinceList: [], + cityList: [], + districtList: [], + Cookies: Cookies, + listLoading: false, + stateStockData: [], + rowIndex: '-1', + OrderIndexArr: [], + hoverOrderArr: [] + } + }, + created() { + const t = this + t.getList() + }, + mounted() { + }, + watch: {}, + methods: { + async getList(){ + const res = await getStorehouseDataByUser() + if(res.data.code == 200){ + this.stateStockData=[] + if(res.data.result.reserveData && Array.isArray(res.data.result.reserveData)){ + const tableData = res.data.result.reserveData + if(tableData.length>0){ + tableData.map(item=>{ + if(Array.isArray(item.storehouseInfos)){ + item.storehouseInfos.map((subRes, subIndex)=>{ + let content = {} + content = subRes + content['topId'] = item.id + content['reserveName'] = item.reserveName + content['enterpriseName'] = item.enterpriseName + content['province'] = item.province + content['city'] = item.city + content['area'] = item.area + content['reserveAddress'] = item.reserveAddress + content['topSquare'] = item.square + content['topEffectiveStorageSquare'] = item.effectiveStorageSquare + content['topNuclearDose'] = item.nuclearDose + // 重点!赋值合并的行数数值,只需要取子循环的第一个数赋值待合并的行数即可 + if(subIndex == 0){ + content['rowNum'] = item.storehouseInfos.length + } + this.stateStockData.push(content) + }) + } + }) + } + } + }else{ + this.$message({ + type:'warning', + message: res.data.message + }) + } + }, + + openStock(type,data){ + const t = this + t.$refs.addStock.open(type,data) + }, + openRecord(row){ + const t = this + t.$refs.stockRecords.open() + }, + showEnterprises(row){ + const t = this + t.$refs.enterStock.open(row) + }, + deliverUsage(row){ + const t = this + t.$refs.deliverUsage.open(row) + }, + + stockEdit(row){ + const t = this + t.$refs.editStock.open(row) + + }, + objectSpanMethod({ row, column, rowIndex, columnIndex }) { + // columnIndex 代表列数,从0开始计数,我们要合并的字段属于第一列,取0 + if(columnIndex <= 6){ + return { + rowspan: row.rowNum, // 待合并行数 -- 合并的行数长度就等于之前赋值的子数据的长度;未赋值的即表示0,不显示 + colspan: row.rowNum>0?1:0 // 待合并列数 -- 合并的列数自身占一列,被合并的要返回0,表示不显示 + }; + } + }, + tableRowClassName({row,rowIndex}) { + let arr = this.hoverOrderArr + for (let i = 0; i < arr.length; i++) { + if (rowIndex == arr[i]) { + return 'hovered-row' + } + } + }, + cellMouseEnter(row, column, cell, event) { + this.rowIndex = row.rowIndex; + this.hoverOrderArr = []; + this.OrderIndexArr.forEach(element => { + if (element.indexOf(this.rowIndex) >= 0) { + this.hoverOrderArr = element + } + }) + }, + cellMouseLeave(row, column, cell, event) { + this.rowIndex = '-1' + this.hoverOrderArr = []; + }, + }, +} +</script> +<style> +.el-table .hovered-row { + background: #f5f7fa; +} +</style> +<style scoped> +.basic_search { + display: inline-block; +} +/deep/.el-table .el-table__body-wrapper table tr:nth-child(2n) td{ + background: #fff !important; +} +</style> diff --git a/src/views/warehouse/stockSupervision.vue b/src/views/warehouse/stockSupervision.vue new file mode 100644 index 0000000..c1b64d5 --- /dev/null +++ b/src/views/warehouse/stockSupervision.vue @@ -0,0 +1,403 @@ +<template> + <div class="app-container"> + <div class="filter-container"> + <div style="display: block;"> + <div class="basic_search"> + <span>区域:</span> + <el-select v-model="listQuery.province" clearable filterable @change="changeArea('province')"> + <el-option + v-for="item in provinceList" + :key="item.id" + :label="item.name" + :value="item.name" + > + </el-option> + </el-select> + </div> + <div class="basic_search"> + <el-select v-model="listQuery.city" prop="city" clearable filterable @change="changeArea('city')"> + <el-option + v-for="item in cityList" + :key="item.id" + :label="item.name" + :value="item.name" + > + </el-option> + </el-select> + </div> + <div class="basic_search"> + <el-select v-model="listQuery.area" clearable filterable @change="changeArea('area')"> + <el-option + v-for="item in districtList" + :key="item.id" + :label="item.name" + :value="item.name" + > + </el-option> + </el-select> + </div> + <div class="basic_search"> + <span>企业名称:</span> + <el-input filterable clearable v-model="listQuery.enterpriseName" style="width:200px"> + </el-input> + </div> + <div class="basic_search"> + <span>库区名称:</span> + <el-input filterable clearable v-model="listQuery.reserveName" style="width:200px"> + </el-input> + </div> + <div class="basic_search" style="margin-right: 10px"> + <el-button style="margin-left: 10px;" type="primary" @click="reset()">重置</el-button> + <el-button style="margin-left: 10px;" type="primary" icon="el-icon-search" @click="searchData()">查询</el-button> + </div> + </div> + </div> + <div class="table_content"> + <el-table + v-loading="listLoading" + :data="stateStockData" + :span-method="objectSpanMethod" + :cell-class-name="tableRowClassName" @cell-mouse-leave="cellMouseLeave" @cell-mouse-enter="cellMouseEnter" + border + :stripe="false" + style="width: 100%;" + > + <el-table-column label="库区名称" prop="reserveName" align="center" fixed="left"> + <template slot-scope="scope"> + <span v-if="scope.row.reserveName =='合计'">{{scope.row.reserveName}}</span> + <el-link v-else type="primary" @click="openStock('edit',scope.row)">{{scope.row.reserveName}}</el-link> + </template> + </el-table-column> + <el-table-column label="所属区域" prop="region" align="center" fixed="left"/> + <el-table-column label="所属企业" prop="enterpriseName" align="center"></el-table-column> + <el-table-column label="地址" prop="topAddress" align="center"></el-table-column> + <el-table-column label="库区面积/㎡" prop="topSquare" align="center"></el-table-column> + <el-table-column label="有效存储总面积/㎡" prop="topStorageSquare" align="center"></el-table-column> + <el-table-column label="总库容量" prop="topApprovedReserves" align="center"></el-table-column> + <el-table-column label="总核药量" prop="topNuclearDose" align="center"></el-table-column> + <el-table-column label="库房名称" prop="storehouseName" align="center"> + <template slot-scope="scope"> + <span v-if="scope.row.storehouseName == '本库区合计'||scope.row.storehouseName == '合计'">{{scope.row.storehouseName}}</span> + <el-link v-else type="primary" @click="openRecord(scope.row)">{{scope.row.storehouseName}}</el-link> + </template> + </el-table-column> + <el-table-column label="库房面积/㎡" prop="square" align="center"></el-table-column> + <el-table-column label="有效存储面积/㎡" prop="storageSquare" align="center"></el-table-column> + <el-table-column label="库容量/箱" prop="approvedReserves" align="center"></el-table-column> + <el-table-column label="核药量/kg" prop="nuclearDose" align="center"></el-table-column> + <el-table-column label="当前总库存" prop="totalStock" align="center"></el-table-column> + <el-table-column label="爆竹类(箱)" prop="firecracker" align="center"></el-table-column> + <el-table-column label="喷花类(箱)" prop="spray" align="center"></el-table-column> + <el-table-column label="旋转类(箱)" prop="rotation" align="center"></el-table-column> + <el-table-column label="吐珠类(箱)" prop="bead" align="center"></el-table-column> + <el-table-column label="玩具类(箱)" prop="toy" align="center"></el-table-column> + <el-table-column label="组合烟花类(箱)" prop="combined" align="center"></el-table-column> + <el-table-column label="是否超量" prop="overShoot" align="center"> + <template slot-scope="scope"> + <span>{{scope.row.overShoot ==0?'否':scope.row.overShoot ==1?'是':'--'}}</span> + </template> + </el-table-column> + <el-table-column label="是否允许盘库" prop="inventoryStatus" align="center"> + <template slot-scope="scope"> + <span v-if="scope.row.inventoryStatus == null">--</span> + <el-switch :disabled="disable" v-else v-model="scope.row.inventoryStatus" :active-value="1" :inactive-value="0" @change="changeStatus($event,scope.row)"></el-switch> + </template> + </el-table-column> + <el-table-column label="操作" align="center" width="120" class-name="small-padding fixed-width" fixed="right"> + <template slot-scope="scope" v-if="scope.row.storehouseName !== '本库区合计' && scope.row.storehouseName !== '合计'"> + <el-button type="text" @click="showEnterprises(scope.row)">查看详情</el-button> + <el-button type="text" @click="delData(scope.row)">删除</el-button> + </template> + </el-table-column> + </el-table> + <br> + <add-stock ref="addStock" @refresh="getList"></add-stock> + <stock-records ref="stockRecords"></stock-records> + <enterprise-stock ref="enterStock"></enterprise-stock> + </div> + </div> +</template> + +<script> +import {computePageCount} from "../../utils"; +import {delStore, getReservesForUser, getSupervisionStatistics, changeInventory} from "../../api/warehouse" +import addStock from "./components/addStock" +import stockRecords from "./components/stockRecords" +import enterpriseStock from "./components/enterpriseStock" +import Cookies from "js-cookie" +import {getCityListData, getProvinceListData} from "../../api/area"; +import {MessageBox} from "_element-ui@2.14.1@element-ui"; +export default { + name: "stockSupervision", + components: {addStock,stockRecords, enterpriseStock}, + data() { + return { + tableKey: '', + disable: false, + provinceList: [], + cityList: [], + districtList: [], + Cookies: Cookies, + listLoading: false, + stateStockData: [], + rowIndex: '-1', + OrderIndexArr: [], + hoverOrderArr: [], + listQuery: { + province: '', + city: '', + area: '', + enterpriseName: '', + reserveName: '', + }, + } + }, + created() { + const t = this + t.getList() + t.getProvince() + const roles = JSON.parse(Cookies.get('roles')) + if(roles.find(i=>i.name == '管理员'|| i.name == '监管部门')){ + this.disable = false + }else{ + this.disable = true + } + }, + mounted() { + }, + watch: {}, + methods: { + async getList(){ + const res = await getSupervisionStatistics(this.listQuery) + if(res.data.code == 200){ + this.stateStockData=[] + const tableData = res.data.result.reserves + if(Array.isArray(tableData)){ + tableData.map(item=>{ + if(Array.isArray(item.storehouse.warehouses) && item.storehouse.whTotal){ + let obj = { + approvedReserves: item.storehouse.whTotal.wtotalApprovedReserves, + bead: item.storehouse.whTotal.wtotalBead, + combined: item.storehouse.whTotal.wtotalCombined, + firecracker: item.storehouse.whTotal.wtotalFirecracker, + inventoryStatus: null, + nuclearDose: item.storehouse.whTotal.wtotalNuclearDose, + overShoot: null, + rotation: item.storehouse.whTotal.wtotalRotation, + spray: item.storehouse.whTotal.wtotalSpray, + square: item.storehouse.whTotal.wtotalSquare, + storageSquare: item.storehouse.whTotal.wtotalStorageSquare, + storehouseId: null, + storehouseName: item.storehouse.whTotal.wname, + totalStock: item.storehouse.whTotal.wtotalStock, + toy: item.storehouse.whTotal.wtotalToy, + } + item.storehouse.warehouses.push(obj) + item.storehouse.warehouses.map((subRes, subIndex)=>{ + let content = {} + content = subRes + content['topId'] = item.reserveId + content['reserveName'] = item.reserveName + content['enterpriseName'] = item.enteripriseName + content['region'] = item.region + content['topAddress'] = item.reserveAddress + content['topSquare'] = item.square + content['topStorageSquare'] = item.storageSquare + content['topApprovedReserves'] = item.approvedReserves + content['topNuclearDose'] = item.nuclearDose + // 重点!赋值合并的行数数值,只需要取子循环的第一个数赋值待合并的行数即可 + if(subIndex == 0){ + content['rowNum'] = item.storehouse.warehouses.length + } + this.stateStockData.push(content) + }) + } + }) + } + if(res.data.result.total){ + const total = res.data.result.total + let totalObj = { + topId: null, + reserveName: total.name, + region: '--', + topAddress: '--', + enterpriseName: '--', + storehouseName: '合计', + rowNum: 1, + topSquare: total.resTotalSquare, + topStorageSquare: total.resTotalStorageSquare, + topApprovedReserves: total.resTotalApprovedReserves, + topNuclearDose: total.resTotalNuclearDose, + firecracker: total.totalFirecracker, + rotation: total.totalRotation, + spray: total.totalSpray, + totalStock: total.totalStock, + toy: total.totalToy, + approvedReserves: total.whTotalApprovedReserves, + square: total.whTotalSquare, + storageSquare: total.whTotalStorageSquare, + nuclearDose: total.whTotalNuclearDose, + bead: total.totalBead, + combined: total.totalCombined + } + this.stateStockData.push(totalObj) + } + }else{ + this.$message({ + type:'warning', + message: res.data.message + }) + } + }, + + searchData(){ + this.getList() + }, + + reset(){ + this.listQuery={ + province: '', + city: '', + area: '', + enterpriseName: '', + reserveName: '' + } + this.getList() + }, + + showEnterprises(row){ + const t = this + t.$refs.enterStock.open(row) + }, + + openStock(type,data){ + const t = this + t.$refs.addStock.open(type,data) + }, + + openRecord(row){ + const t = this + t.$refs.stockRecords.open(row) + }, + + delData(row){ + const t = this + MessageBox.confirm('确定删除库房名为:' + row.storehouseName + '的信息', '确定删除', { + confirmButtonText: '确定', + cancelButtonText: '取消', + type: 'warning' + }).then(() => { + t.deleteStore(row.storehouseId) + }).catch(() => { + console.log('已取消删除') + }) + }, + + async deleteStore(id){ + const res = await delStore({id: id}) + if(res.data.code == 200){ + this.$message({ + type:'success', + message: '删除成功' + }) + }else{ + this.$message({ + type:'warning', + message: res.data.message + }) + } + }, + + async getProvince(){ + let res = await getProvinceListData() + if(res.data.code === "200"){ + this.provinceList = res.data.result.provinceList + } + }, + + changeStatus(val,row){ + MessageBox.confirm('确定删除库房名为:' + row.storehouseName + '的盘库许可状态', '确定修改', { + confirmButtonText: '确定', + cancelButtonText: '取消', + type: 'warning' + }).then(async () => { + const res = await changeInventory({inventoryStatus: val,id: row.storehouseId}) + if(res.data.code == 200){ + this.$message({ + type:'success', + message: '修改成功' + }) + }else{ + this.$message({ + type:'warning', + message: res.data.message + }) + } + }).catch(() => { + this.getList() + }) + }, + + async changeArea(value) { + if (value === 'province') { + this.listQuery.city = '' + this.listQuery.area = '' + let res = await getCityListData({type:2, parenttype:1, parentname:this.listQuery.province}) + if (res.data.code === "200") { + this.cityList = res.data.result + } + } else if (value === 'city') { + this.listQuery.area = '' + let res = await getCityListData({type:3, parenttype:2, parentname:this.listQuery.city}) + if (res.data.code === "200") { + this.districtList = res.data.result + } + } + }, + + objectSpanMethod({ row, column, rowIndex, columnIndex }) { + // columnIndex 代表列数,从0开始计数,我们要合并的字段属于第一列,取0 + if(columnIndex <= 7){ + return { + rowspan: row.rowNum, // 待合并行数 -- 合并的行数长度就等于之前赋值的子数据的长度;未赋值的即表示0,不显示 + colspan: row.rowNum>0?1:0 // 待合并列数 -- 合并的列数自身占一列,被合并的要返回0,表示不显示 + }; + } + }, + tableRowClassName({row,rowIndex}) { + let arr = this.hoverOrderArr + for (let i = 0; i < arr.length; i++) { + if (rowIndex == arr[i]) { + return 'hovered-row' + } + } + }, + cellMouseEnter(row, column, cell, event) { + this.rowIndex = row.rowIndex; + this.hoverOrderArr = []; + this.OrderIndexArr.forEach(element => { + if (element.indexOf(this.rowIndex) >= 0) { + this.hoverOrderArr = element + } + }) + }, + cellMouseLeave(row, column, cell, event) { + this.rowIndex = '-1' + this.hoverOrderArr = []; + }, + }, +} +</script> +<style> +.el-table .hovered-row { + background: #f5f7fa; +} +</style> +<style scoped> +.basic_search { + display: inline-block; +} +/deep/.el-table .el-table__body-wrapper table tr:nth-child(2n) td{ + background: #fff !important; +} +</style> -- Gitblit v1.9.2