From e3d63f84a43db07fa5992de2937ee23fc67bad38 Mon Sep 17 00:00:00 2001
From: Your Name <123456>
Date: Fri, 06 Jan 2023 16:43:58 +0800
Subject: [PATCH] 物资
---
src/views/facilityManagement/safetyGoodsAndEquipment/index.vue | 53 +
src/views/facilityManagement/claimReturnRecords/components/returnAndWatch.vue | 239 +++++++++
src/utils/request.ts | 2
src/views/facilityManagement/safetyGoodsAndEquipment/components/safetyGoodsAndEquipmentDialog.vue | 73 +-
src/views/facilityManagement/claimReturnRecords/index.ts | 76 +++
src/views/facilityManagement/safetyGoodsAndEquipment/components/addGoodsDialog.vue | 3
src/views/facilityManagement/safetyGoodsAndEquipment/index.ts | 7
src/views/facilityManagement/goodsDetailManage/index.ts | 2
src/views/facilityManagement/goodsTypeManage/index.vue | 435 ++++++++++++++++++
src/views/facilityManagement/claimReturnRecords/index.vue | 258 ++++++++++
src/stores/userInfo.ts | 2
src/views/facilityManagement/goodsDetailManage/components/checkOut.vue | 15
src/assets/style/index.scss | 4
src/views/facilityManagement/safetyGoodsAndEquipment/components/batchInStorage.vue | 9
src/stores/interface/index.ts | 2
src/views/facilityManagement/claimReturnRecords/components/invalidDealDialog.vue | 85 +++
src/views/facilityManagement/goodsDetailManage/components/goodsDetailAdd.vue | 57 +-
src/views/facilityManagement/goodsDetailManage/components/goodsDetailEdit.vue | 43
src/api/facilityManagement/claimReturnRecords/index.ts | 27 +
src/views/loginPage/component/accountLogin.vue | 1
src/views/facilityManagement/safetyGoodsAndEquipment/components/batchOutStorage.vue | 12
21 files changed, 1,291 insertions(+), 114 deletions(-)
diff --git a/src/api/facilityManagement/claimReturnRecords/index.ts b/src/api/facilityManagement/claimReturnRecords/index.ts
new file mode 100644
index 0000000..58e17b0
--- /dev/null
+++ b/src/api/facilityManagement/claimReturnRecords/index.ts
@@ -0,0 +1,27 @@
+import request from "/@/utils/request";
+
+export function claimReturnRecordsApi() {
+ return {
+ getClaimReturnRecords: (data: {}) => {
+ return request({
+ url: import.meta.env.VITE_API_URL_OUT + `/equipment/material/record/page/list`,
+ method: 'post',
+ data
+ });
+ },
+ returnGoods: (data: {}) => {
+ return request({
+ url: import.meta.env.VITE_API_URL_OUT + `/equipment/material/record/revert`,
+ method: 'post',
+ data
+ });
+ },
+ refreshReturnAndNoReturn: (data: {}) => {
+ return request({
+ url: import.meta.env.VITE_API_URL_OUT + `/equipment/material/record/queryById`,
+ method: 'post',
+ data
+ });
+ },
+ }
+}
diff --git a/src/assets/style/index.scss b/src/assets/style/index.scss
index 22aad3b..1503233 100644
--- a/src/assets/style/index.scss
+++ b/src/assets/style/index.scss
@@ -3,6 +3,10 @@
padding-right: 10px;
padding-bottom: 10px;
}
+.input-box2{
+ width: 200px !important;
+ padding-right: 10px;
+}
.input-add{
width: 90% !important;
}
diff --git a/src/stores/interface/index.ts b/src/stores/interface/index.ts
index a0999d6..9ace21a 100644
--- a/src/stores/interface/index.ts
+++ b/src/stores/interface/index.ts
@@ -11,7 +11,7 @@
time: number;
userName: string;
uid: string;
- depId: string;
+ depId: null | number;
projectId: string;
dataList: [];
}
diff --git a/src/stores/userInfo.ts b/src/stores/userInfo.ts
index 973c82a..edbe1ed 100644
--- a/src/stores/userInfo.ts
+++ b/src/stores/userInfo.ts
@@ -15,7 +15,7 @@
roles: [],
authBtnList: [],
uid: '',
- depId: '',
+ depId: null,
projectId: '',
dataList: []
}
diff --git a/src/utils/request.ts b/src/utils/request.ts
index 05e9b36..ed8cf58 100644
--- a/src/utils/request.ts
+++ b/src/utils/request.ts
@@ -44,7 +44,7 @@
// if(typeof JSON.parse(data) === 'object'){
// return JSONbig.parse(data);
// };
- return JSONbig.parse(data);
+ return JSONbig.parse(data);
} catch (err) {
// 转换失败返回一个空对象
return data
diff --git a/src/views/facilityManagement/claimReturnRecords/components/invalidDealDialog.vue b/src/views/facilityManagement/claimReturnRecords/components/invalidDealDialog.vue
new file mode 100644
index 0000000..7f0503e
--- /dev/null
+++ b/src/views/facilityManagement/claimReturnRecords/components/invalidDealDialog.vue
@@ -0,0 +1,85 @@
+<template>
+ <div>
+ <el-dialog :title="invalidDealState.title" :close-on-click-modal="false" v-model="invalidDealState.invalidDealDialogVisible" width="30%">
+ <el-form
+ :model="invalidDealState.invalidDealForm"
+ ref="invalidDealFormRef"
+ size="default"
+ label-width="150px">
+ <el-row>
+ <el-col :span="24" class="mb20">
+ <el-form-item label="失效原因:" prop="reason">
+ <el-select class="input-add" v-model="invalidDealState.invalidDealForm.reason" placeholder="失效原因">
+ <el-option
+ v-for="item in invalidDealState.reasonList"
+ :key="item.id"
+ :value="item.id"
+ :label="item.name"
+ ></el-option>
+ </el-select>
+ </el-form-item>
+ </el-col>
+ <el-col :span="24" class="mb20">
+ <el-form-item label="备注:" prop="remark">
+ <el-input type="textarea" :rows="3" v-model="invalidDealState.invalidDealForm.remark" placeholder="备注" class="input-add">
+ </el-input>
+ </el-form-item>
+ </el-col>
+ </el-row>
+ </el-form>
+ <template #footer>
+ <span class="dialog-footer">
+ <el-button @click="invalidDealState.invalidDealDialogVisible = !invalidDealState.invalidDealDialogVisible" size="default">取 消</el-button>
+ <el-button type="primary" @click="submitInvalidDeal" v-throttle size="default">确 定</el-button>
+ </span>
+ </template>
+ </el-dialog>
+ </div>
+</template>
+
+<script setup lang="ts">
+import { reactive, ref } from 'vue'
+import {InvalidDealStateType, materialType} from '..'
+
+const invalidDealFormRef = ref()
+
+const invalidDealState = reactive<InvalidDealStateType>({
+ title: '',
+ invalidDealDialogVisible: false,
+ invalidDealForm: {
+ id: null,
+ reason: null,
+ remark: null,
+ },
+ reasonList:[
+ {id: 0, name:'完好'},
+ {id: 1, name:'损坏'},
+ {id: 2, name:'丢失'},
+ {id: 3, name:'过期'},
+ {id: 4, name:'其他'}
+ ]
+})
+
+const openInvalidDealDialog = (value: materialType) => {
+ invalidDealState.invalidDealDialogVisible = true
+ invalidDealState.invalidDealForm.id = value.id
+ invalidDealState.invalidDealForm.reason = value.materialStatus
+ invalidDealState.invalidDealForm.remark = value.remark
+}
+
+const submitInvalidDeal = () => {
+ emit('refreshInvalidDeal',invalidDealState.invalidDealForm)
+ invalidDealState.invalidDealDialogVisible = false
+}
+
+const emit = defineEmits(['refreshInvalidDeal'])
+
+defineExpose({
+ openInvalidDealDialog
+})
+
+</script>
+
+<style scoped>
+
+</style>
diff --git a/src/views/facilityManagement/claimReturnRecords/components/returnAndWatch.vue b/src/views/facilityManagement/claimReturnRecords/components/returnAndWatch.vue
new file mode 100644
index 0000000..9f1b860
--- /dev/null
+++ b/src/views/facilityManagement/claimReturnRecords/components/returnAndWatch.vue
@@ -0,0 +1,239 @@
+<template>
+ <div class="system-add-menu-container">
+ <el-dialog :title="returnAndWatchState.title" :close-on-click-modal="false" v-model="returnAndWatchState.showReturnAndWatchDialog" width="50%">
+ <el-tabs class="active" v-model="returnAndWatchState.activeName">
+ <el-tab-pane label="未归还" name="noReturn">
+ <el-table
+ :data="returnAndWatchState.noReturnData"
+ border fit highlight-current-row lazy
+ :header-cell-style="{ background: '#fafafa' }"
+ style="width: 100%"
+ @selection-change="handleSelectionChange"
+ >
+ <el-table-column v-if="returnAndWatchState.ifShow === true" type="selection" width="55"/>
+ <el-table-column prop="materialName" label="物资名称" show-overflow-tooltip align="center"/>
+ <el-table-column prop="smdId" label="物资编号" show-overflow-tooltip align="center"/>
+ <el-table-column prop="materialStatus" label="物资状态" show-overflow-tooltip align="center">
+ <template #default="scope">
+ <span>
+ {{ filterMaterialStatus(scope.row.materialStatus) }}
+ </span>
+ </template>
+ </el-table-column>
+ <el-table-column prop="remark" label="备注" show-overflow-tooltip align="center"/>
+ <el-table-column label="操作" width="150" align="center">
+ <template #default="scope">
+ <el-button size="small" v-if="returnAndWatchState.ifShow === true" text type="danger" :icon="Delete" @click="invalidDeal(scope.row)">无效处理</el-button>
+ </template>
+ </el-table-column>
+ </el-table>
+ <div style="padding-top: 20px" align="center">
+ <span>
+ <el-button type="primary" v-if="returnAndWatchState.ifShow === true" @click="returnConfirm" v-throttle size="default">归 还</el-button>
+ </span>
+ </div>
+
+ </el-tab-pane>
+ <el-tab-pane label="已归还" name="return">
+ <el-table
+ :data="returnAndWatchState.returnData"
+ border fit highlight-current-row lazy
+ :header-cell-style="{ background: '#fafafa' }"
+ style="width: 100%">
+ <el-table-column prop="materialName" label="物资名称" show-overflow-tooltip align="center"/>
+ <el-table-column prop="smdId" label="物资编号" show-overflow-tooltip align="center"/>
+ <el-table-column prop="materialStatus" label="物资状态" show-overflow-tooltip align="center">
+ <template #default="scope">
+ <span>
+ {{ filterMaterialStatus(scope.row.materialStatus) }}
+ </span>
+ </template>
+ </el-table-column>
+ <el-table-column prop="remark" label="备注" show-overflow-tooltip align="center"/>
+ </el-table>
+ </el-tab-pane>
+ <el-tab-pane label="无效操作" name="Invalid">
+ <el-table
+ :data="returnAndWatchState.invalidData"
+ border fit highlight-current-row lazy
+ :header-cell-style="{ background: '#fafafa' }"
+ style="width: 100%">
+ <el-table-column prop="materialName" label="物资名称" show-overflow-tooltip align="center"/>
+ <el-table-column prop="smdId" label="物资编号" show-overflow-tooltip align="center"/>
+ <el-table-column prop="materialStatus" label="物资状态" show-overflow-tooltip align="center">
+ <template #default="scope">
+ <span>
+ {{ filterMaterialStatus(scope.row.materialStatus) }}
+ </span>
+ </template>
+ </el-table-column>
+ <el-table-column prop="remark" label="备注" show-overflow-tooltip align="center"/>
+ </el-table>
+ </el-tab-pane>
+ </el-tabs>
+ </el-dialog>
+ <invalid-deal-dialog ref="invalidDealDialogRef" @refreshInvalidDeal="refreshInvalidDeal"></invalid-deal-dialog>
+ </div>
+</template>
+
+<script setup lang="ts">
+import {computed, nextTick, onMounted, reactive, ref, toRefs, watch} from 'vue'
+import { Edit, Delete, } from '@element-plus/icons-vue';
+import {
+ claimReturnDataType, InvalidDealFormType,
+ materialType,
+ ReturnAndWatchType
+} from "/@/views/facilityManagement/claimReturnRecords/index";
+import {ElMessage, ElMessageBox} from "element-plus";
+import {claimReturnRecordsApi} from "/@/api/facilityManagement/claimReturnRecords";
+import InvalidDealDialog from './invalidDealDialog.vue'
+
+const invalidDealDialogRef = ref()
+
+const returnAndWatchState = reactive<ReturnAndWatchType>({
+ title: '',
+ ifShow: false,
+ goodsClassifyTitle: '',
+ showReturnAndWatchDialog: false,
+ activeName: 'noReturn',
+ goodsClassifyForm: {
+ id: null,
+ materialClassifyName: '',
+ parentId: null,
+ },
+ goodsClassifyRules: {
+
+ },
+ returnData: [],
+ noReturnData: [],
+ invalidData: [],
+ returnFormList: {
+ receiveBaseId: null,
+ materialList: []
+ },
+ reasonList:[
+ {id: 0, name:'完好'},
+ {id: 1, name:'损坏'},
+ {id: 2, name:'丢失'},
+ {id: 3, name:'过期'},
+ {id: 4, name:'其他'}
+ ]
+});
+
+const openReturnAndWatchDialog = (title: string, value: claimReturnDataType ) => {
+ returnAndWatchState.showReturnAndWatchDialog = true;
+ returnAndWatchState.returnFormList.receiveBaseId = value.id;
+ if(title === '归还'){
+ returnAndWatchState.ifShow = true;
+ returnAndWatchState.title = '归还记录';
+ returnAndWatchState.returnData = value.materialList.filter(item => item.revertStatus === 0);
+ returnAndWatchState.noReturnData = JSON.parse(JSON.stringify(value.materialList.filter(item => item.revertStatus === 1)));
+ returnAndWatchState.invalidData = value.materialList.filter(item => item.revertStatus !== 0 && item.revertStatus !== 1);
+ }else {
+ returnAndWatchState.ifShow = false;
+ returnAndWatchState.title = '查看物资';
+ returnAndWatchState.returnData = value.materialList.filter(item => item.revertStatus === 0);
+ returnAndWatchState.noReturnData = value.materialList.filter(item => item.revertStatus === 1);
+ returnAndWatchState.invalidData = value.materialList.filter(item => item.revertStatus !== 0 && item.revertStatus !== 1);
+ }
+};
+
+const returnConfirm = () => {
+ if(returnAndWatchState.returnFormList.materialList.length > 0){
+ ElMessageBox.confirm(`此操作将把所选中物资全部归还,是否继续?`, '提示', {
+ confirmButtonText: '确认',
+ cancelButtonText: '取消',
+ type: 'warning'
+ })
+ .then(async () => {
+ let res = await claimReturnRecordsApi().returnGoods(returnAndWatchState.returnFormList);
+ if (res.data.code === '200') {
+ ElMessage({
+ type: 'success',
+ duration: 2000,
+ message: '物资归还成功'
+ });
+ await refreshReturnTableData()
+ emit('refreshReturnData')
+ } else {
+ ElMessage({
+ type: 'warning',
+ message: res.data.msg
+ });
+ }
+ })
+ .catch(() => {});
+ }else{
+ ElMessage({
+ type:'warning',
+ message: '请选择要归还的物资'
+ })
+ }
+};
+
+const refreshReturnTableData = async () => {
+ let res = await claimReturnRecordsApi().refreshReturnAndNoReturn({id: returnAndWatchState.returnFormList.receiveBaseId})
+ if(res.data.code === '200'){
+ returnAndWatchState.returnData = res.data.data.materialList.filter((item: materialType) => item.revertStatus === 0);
+ returnAndWatchState.noReturnData = res.data.data.materialList.filter((item: materialType) => item.revertStatus === 1);
+ returnAndWatchState.invalidData = res.data.data.materialList.filter((item: materialType) => item.revertStatus !== 0 && item.revertStatus !== 1);
+ }else{
+ ElMessage({
+ type: 'warning',
+ message: res.data.msg
+ });
+ }
+}
+
+const invalidDeal = (value: materialType) => {
+ invalidDealDialogRef.value.openInvalidDealDialog(value)
+};
+
+const refreshInvalidDeal = (value: InvalidDealFormType) => {
+ let returnDataNum = returnAndWatchState.noReturnData.findIndex(item => item.id == value.id)
+ returnAndWatchState.noReturnData[returnDataNum].materialStatus = value.reason as number
+ returnAndWatchState.noReturnData[returnDataNum].remark = value.remark as string
+ for(let i in returnAndWatchState.returnFormList.materialList){
+ if(returnAndWatchState.returnFormList.materialList[i].receiveId === value.id){
+ returnAndWatchState.returnFormList.materialList[i] = {
+ receiveId: value.id,
+ materialStatus: value.reason,
+ remark: value.remark,
+ }
+ }
+ }
+}
+
+const handleSelectionChange = (val: materialType []) => {
+ returnAndWatchState.returnFormList.materialList = val.map((item: materialType) => {
+ return {
+ receiveId: item.id,
+ materialStatus: item.materialStatus,
+ remark: item.remark,
+ }
+ })
+};
+
+const filterMaterialStatus = (value: number) => {
+ return returnAndWatchState.reasonList.find(item => item.id === value)?.name
+}
+
+const emit = defineEmits(['refreshReturnData']);
+
+defineExpose({
+ openReturnAndWatchDialog,
+});
+
+
+</script>
+
+<style scoped>
+/*:deep(.el-overlay .el-overlay-dialog .el-dialog .el-dialog__body) {*/
+/* padding-bottom: 20px !important;*/
+/*}*/
+:deep(.el-table .big-row) {
+ font-size: 16px !important;
+ font-weight: 700;
+}
+
+</style>
diff --git a/src/views/facilityManagement/claimReturnRecords/index.ts b/src/views/facilityManagement/claimReturnRecords/index.ts
new file mode 100644
index 0000000..bd9130c
--- /dev/null
+++ b/src/views/facilityManagement/claimReturnRecords/index.ts
@@ -0,0 +1,76 @@
+export interface ClaimReturnRecordsType {
+ tableLoading: boolean,
+ total: number,
+ timeValue: Array<string>,
+ claimReturnData: Array<claimReturnDataType> ,
+ listQuery: {
+ pageSize: number,
+ pageIndex: number,
+ searchParams: {
+ materialName: string| null,
+ receiveUname: string | null,
+ endTime: string | null,
+ startTime: string | null,
+ }
+ },
+}
+
+export interface ReturnAndWatchType {
+ title: string,
+ ifShow: Boolean,
+ goodsClassifyTitle: string,
+ showReturnAndWatchDialog: boolean,
+ activeName: string,
+ goodsClassifyForm: {
+ id: null,
+ materialClassifyName: '',
+ parentId: null,
+ },
+ goodsClassifyRules: {
+
+ },
+ returnData: materialType [],
+ noReturnData: materialType [],
+ invalidData: materialType [],
+ returnFormList: {
+ receiveBaseId: null | number,
+ materialList: returnFormListType [] ,
+ },
+ reasonList: Type []
+}
+
+export interface claimReturnDataType {
+ id: number,
+ materialList: materialType [],
+}
+
+export interface materialType {
+ id: number,
+ materialStatus: number,
+ revertStatus: number,
+ remark: string | null,
+}
+
+export interface returnFormListType {
+ receiveId: number,
+ materialStatus: number | null,
+ remark: string | null,
+}
+
+export interface InvalidDealStateType {
+ title: string,
+ invalidDealDialogVisible: boolean,
+ invalidDealForm: InvalidDealFormType,
+ reasonList: Type []
+}
+
+export interface InvalidDealFormType {
+ id: number | null,
+ reason: number | null,
+ remark: string | null,
+}
+
+export interface Type {
+ id: number,
+ name: string,
+}
diff --git a/src/views/facilityManagement/claimReturnRecords/index.vue b/src/views/facilityManagement/claimReturnRecords/index.vue
new file mode 100644
index 0000000..e4cf148
--- /dev/null
+++ b/src/views/facilityManagement/claimReturnRecords/index.vue
@@ -0,0 +1,258 @@
+<template>
+ <div class="home-container">
+ <div style="height: 100%">
+ <el-row class="homeCard">
+ <div class="basic-line">
+ <span>领取时间:</span>
+ <el-date-picker
+ value-format="YYYY-MM-DD"
+ v-model="claimReturnRecordsState.timeValue"
+ type="daterange"
+ range-separator="To"
+ start-placeholder="开始时间"
+ end-placeholder="结束时间"
+ />
+ </div>
+<!-- <div class="basic-line">-->
+<!-- <span>领取人:</span>-->
+<!-- <el-input class="input-box2" v-model="claimReturnRecordsState.listQuery.searchParams.materialName" placeholder="领取人" clearable> </el-input>-->
+<!-- </div>-->
+ <div>
+ <el-button size="large" type="primary" class="ml10" v-throttle @click="initClaimReturnData">
+ <el-icon>
+ <ele-Search />
+ </el-icon>
+ 查询
+ </el-button>
+ </div>
+ </el-row>
+ <div class="homeCard">
+ <div class="main-card">
+ <el-table element-loading-text="Loading..." v-loading="claimReturnRecordsState.tableLoading" :data="claimReturnRecordsState.claimReturnData" style="width: 100%" height="calc(100% - 100px)" :header-cell-style="{ background: '#fafafa' }">
+ <el-table-column type="index" label="序号" width="60" />
+ <el-table-column prop="createTime" label="物资领取时间" show-overflow-tooltip></el-table-column>
+ <el-table-column prop="receiveUname" label="领取人" show-overflow-tooltip></el-table-column>
+ <el-table-column prop="materialName" label="物资" show-overflow-tooltip></el-table-column>
+ <el-table-column prop="receiveCount" label="领取数量" show-overflow-tooltip></el-table-column>
+ <el-table-column prop="revertCount" label="已归还数量" show-overflow-tooltip></el-table-column>
+ <el-table-column prop="statusName" label="归还情况" show-overflow-tooltip>
+ <template #default="scope">
+ <el-tag :type="scope.row.status === 0 ? 'danger' : scope.row.status === 1 ? 'warning' : scope.row.status === 2 ? 'success' : ''">
+ <span>
+ {{ scope.row.statusName }}
+ </span>
+ </el-tag>
+ </template>
+ </el-table-column>
+ <el-table-column label="操作" width="250" align="center">
+ <template #default="scope">
+ <el-button size="small" text type="success" @click="onOpenReturnGoodsDialog('归还', scope.row)">归还</el-button>
+ <el-button size="small" text type="primary" @click="onOpenReturnGoodsDialog('查看物资', scope.row)">查看物资</el-button>
+ </template>
+ </el-table-column>
+ </el-table>
+ <br />
+ <el-pagination @size-change="onHandleSizeChange" @current-change="onHandleCurrentChange" :pager-count="5" :page-sizes="[10, 20, 30]" v-model:current-page="claimReturnRecordsState.listQuery.pageIndex" background v-model:page-size="claimReturnRecordsState.listQuery.pageSize" layout="total, sizes, prev, pager, next, jumper" :total="claimReturnRecordsState.total" class="page-position"> </el-pagination>
+ </div>
+ </div>
+ </div>
+ <return-and-watch ref="returnAndWatchRef" @refreshReturnData="initClaimReturnData"></return-and-watch>
+ </div>
+</template>
+
+<script setup lang="ts">
+import {onMounted, reactive, watch, ref} from "vue";
+import {
+ claimReturnDataType,
+ ClaimReturnRecordsType,
+ materialType
+} from "/@/views/facilityManagement/claimReturnRecords/index";
+import {claimReturnRecordsApi} from "/@/api/facilityManagement/claimReturnRecords";
+import {ElMessage} from "element-plus";
+import ReturnAndWatch from "/@/views/facilityManagement/claimReturnRecords/components/returnAndWatch.vue";
+
+const returnAndWatchRef = ref();
+
+const claimReturnRecordsState = reactive<ClaimReturnRecordsType>({
+ tableLoading: true,
+ total: 0,
+ timeValue: [],
+ claimReturnData: [],
+ listQuery: {
+ pageSize: 10,
+ pageIndex: 1,
+ searchParams: {
+ materialName: null,
+ receiveUname: null,
+ endTime: null,
+ startTime: null,
+ }
+ },
+});
+
+watch(() => claimReturnRecordsState.timeValue, (newVal, oldVal) => {
+ claimReturnRecordsState.listQuery.searchParams.startTime = newVal?.[0] || null;
+ claimReturnRecordsState.listQuery.searchParams.endTime = newVal?.[1] || null;
+})
+
+const initClaimReturnData = async () => {
+ claimReturnRecordsState.tableLoading = true;
+ let res = await claimReturnRecordsApi().getClaimReturnRecords(claimReturnRecordsState.listQuery);
+ if(res.data.code === '200') {
+ claimReturnRecordsState.claimReturnData = res.data.data;
+ claimReturnRecordsState.total = res.data.total;
+ }else {
+ ElMessage({
+ type:'warning',
+ message: res.data.msg
+ });
+ }
+ claimReturnRecordsState.tableLoading = false;
+};
+
+const onOpenReturnGoodsDialog = (title: string, value: claimReturnDataType) => {
+ returnAndWatchRef.value.openReturnAndWatchDialog(title, value)
+}
+
+const onHandleSizeChange = (val: number) => {
+ claimReturnRecordsState.listQuery.pageSize = val;
+ initClaimReturnData();
+};
+
+const onHandleCurrentChange = (val: number) => {
+ claimReturnRecordsState.listQuery.pageIndex = val;
+ initClaimReturnData();
+};
+
+onMounted(() => {
+ initClaimReturnData()
+})
+</script>
+
+<style scoped lang="scss">
+$homeNavLengh: 8;
+.home-container {
+ height: calc(100vh - 144px);
+ box-sizing: border-box;
+ overflow: hidden;
+.homeCard {
+ width: 100%;
+ padding: 20px;
+ box-sizing: border-box;
+ background: #fff;
+ border-radius: 4px;
+
+.main-card {
+ width: 100%;
+ height: 100%;
+.cardTop {
+ display: flex;
+ align-items: center;
+ justify-content: space-between;
+ margin-bottom: 20px;
+.mainCardBtn {
+ margin: 0;
+}
+}
+.pageBtn {
+ height: 60px;
+ display: flex;
+ align-items: center;
+ justify-content: right;
+
+.demo-pagination-block + .demo-pagination-block {
+ margin-top: 10px;
+}
+.demo-pagination-block .demonstration {
+ margin-bottom: 16px;
+}
+}
+}
+&:last-of-type {
+ height: calc(100% - 100px);
+ }
+}
+.el-row {
+ display: flex;
+ align-items: center;
+ margin-bottom: 20px;
+&:last-child {
+ margin-bottom: 0;
+ }
+.grid-content {
+ align-items: center;
+ min-height: 36px;
+}
+
+.topInfo {
+ display: flex;
+ align-items: center;
+ font-size: 16px;
+ font-weight: bold;
+
+& > div {
+ white-space: nowrap;
+ margin-right: 20px;
+ }
+}
+}
+}
+.stepItem {
+ width: 100%;
+ display: flex;
+ align-items: flex-start;
+ margin-bottom: 30px;
+ margin-left: 30px;
+ padding-bottom: 30px;
+ border-left: 2px solid #ccc;
+&:first-of-type {
+ margin-top: 30px;
+ }
+&:last-of-type {
+ margin-bottom: 0;
+ border-left: none;
+ }
+.stepNum {
+ width: 30px;
+ height: 30px;
+ border-radius: 15px;
+ box-sizing: border-box;
+ color: #333;
+ border: 1px solid #999;
+ line-height: 28px;
+ text-align: center;
+ margin-right: 10px;
+ margin-left: -16px;
+ margin-top: -30px;
+}
+.stepCard {
+ width: 100%;
+ margin-top: -30px;
+
+.box-card {
+ width: 100%;
+&:deep(.el-card__header) {
+ padding: 10px 15px;
+ }
+.card-header {
+ width: 100%;
+ display: flex;
+ justify-content: space-between;
+ align-items: center;
+& > div:first-of-type {
+ margin-right: 80px;
+ font-size: 18px;
+ font-weight: bold;
+ }
+}
+}
+}
+&:hover .card-header {
+ color: #0098f5;
+ }
+&:hover .stepNum {
+ border: 2px solid #0098f5;
+ color: #0098f5;
+ }
+}
+</style>
diff --git a/src/views/facilityManagement/goodsDetailManage/components/checkOut.vue b/src/views/facilityManagement/goodsDetailManage/components/checkOut.vue
index 3d16359..f839bda 100644
--- a/src/views/facilityManagement/goodsDetailManage/components/checkOut.vue
+++ b/src/views/facilityManagement/goodsDetailManage/components/checkOut.vue
@@ -16,8 +16,8 @@
</el-form-item>
</el-col>
<el-col :span="24" class="mb20">
- <el-form-item label="认领人:" prop="claimantId">
- <el-select class="input-add" v-model="checkOutState.checkOutForm.claimantId" placeholder="选择认领人">
+ <el-form-item label="认领人:" prop="receiveUid">
+ <el-select class="input-add" v-model="checkOutState.checkOutForm.receiveUid" placeholder="选择认领人">
<el-option
v-for="item in checkOutState.userList"
:key="item.uid"
@@ -46,6 +46,7 @@
import {teamManageApi} from "/@/api/systemManage/basicDateManage/personShiftManage/teamManage";
import {ElMessage} from "element-plus/es";
import {goodsDetailApi} from "/@/api/facilityManagement/goodsDetailManage";
+import {useUserInfo} from "/@/stores/userInfo";
const checkOutState = reactive<checkOutStateType>({
title: '',
@@ -54,7 +55,7 @@
materialName: '',
checkOutForm: {
id: null,
- claimantId: null,
+ receiveUid: null,
ids: [],
},
userList: [],
@@ -63,21 +64,23 @@
const openCheckOutDialog = (title: string, value: GoodsDetailDataType, ids:Array<number>, checkOutName: null | string) => {
checkOutState.title = title;
checkOutState.checkOutDialogVisible = true;
- checkOutState.checkOutForm.claimantId = null;
- getUserByDepartment(1 as number)
+ checkOutState.checkOutForm.receiveUid = null;
+ getUserByDepartment(useUserInfo().userInfos.depId as number)
if(title === '单独出库'){
checkOutState.materialName = value.name as string
checkOutState.checkOutForm.id = value.id;
+ delete checkOutState.checkOutForm.ids;
}else{
checkOutState.materialName = checkOutName as string
checkOutState.checkOutForm.ids = ids
+ delete checkOutState.checkOutForm.id;
}
}
const submitCheckOutForm = async () => {
- if(checkOutState.checkOutForm.claimantId === null){
+ if(checkOutState.checkOutForm.receiveUid === null){
ElMessage({
type: 'warning',
message: '请选择认领人'
diff --git a/src/views/facilityManagement/goodsDetailManage/components/goodsDetailAdd.vue b/src/views/facilityManagement/goodsDetailManage/components/goodsDetailAdd.vue
index 8004175..b95f332 100644
--- a/src/views/facilityManagement/goodsDetailManage/components/goodsDetailAdd.vue
+++ b/src/views/facilityManagement/goodsDetailManage/components/goodsDetailAdd.vue
@@ -13,22 +13,22 @@
<el-col :span="24" class="mb20">
<el-form-item label="选择物资" prop="smId">
<el-row :gutter="6">
- <el-col :span="8">
- <el-select
- filterable
- placeholder="请选择部门"
- clearable
- @change="changeDepartment"
- v-model="goodsDetailAddState.depId">
- <el-option
- v-for="item in goodsDetailAddState.departmentList"
- :key="item.depId"
- :value="item.depId"
- :label="item.depName"
- ></el-option>
- </el-select>
- </el-col>
- <el-col :span="8">
+<!-- <el-col :span="8">-->
+<!-- <el-select-->
+<!-- filterable-->
+<!-- placeholder="请选择部门"-->
+<!-- clearable-->
+<!-- @change="changeDepartment"-->
+<!-- v-model="goodsDetailAddState.depId">-->
+<!-- <el-option-->
+<!-- v-for="item in goodsDetailAddState.departmentList"-->
+<!-- :key="item.depId"-->
+<!-- :value="item.depId"-->
+<!-- :label="item.depName"-->
+<!-- ></el-option>-->
+<!-- </el-select>-->
+<!-- </el-col>-->
+ <el-col :span="12">
<el-select v-model="goodsDetailAddState.classifyId" placeholder="选择分类" @change="changeClassify" filterable clearable>
<el-option
v-for="item in goodsDetailAddState.classifyList"
@@ -38,7 +38,7 @@
></el-option>
</el-select>
</el-col>
- <el-col :span="8">
+ <el-col :span="12">
<el-select v-model="goodsDetailAddState.goodsDetailForm.smId" placeholder="选择物资" filterable clearable>
<el-option
v-for="item in goodsDetailAddState.goodsList"
@@ -130,8 +130,10 @@
import {ElMessage} from "element-plus/es";
import {goodsDetailApi} from "/@/api/facilityManagement/goodsDetailManage";
import {verifiyNumberInteger, verifyString} from "/@/utils/toolsValidate";
+import {useUserInfo} from "/@/stores/userInfo";
const goodsDetailFormRef = ref()
+const userInfo = useUserInfo()
const goodsDetailAddState = reactive<GoodsDetailAddType>({
title: '新增入库',
@@ -174,8 +176,8 @@
setTimeout(() => {
goodsDetailFormRef.value.clearValidate();
});
- goodsDetailAddState.startRfid = ''
- goodsDetailAddState.endRfid = ''
+ goodsDetailAddState.startRfid = '';
+ goodsDetailAddState.endRfid = '';
goodsDetailAddState.goodsDetailForm = {
id: null,
smId: null,
@@ -184,18 +186,21 @@
startRfid: null,
endRfid: null ,
wareHousingCount: null,
- }
+ };
+ goodsDetailAddState.classifyList = goodsDetailAddState.departmentList.find(item => item.depId === userInfo.userInfos.depId)?.classificationList as Array<ClassificationListType>
}
-const changeDepartment = (value: number | null) => {
- goodsDetailAddState.classifyId = null
- goodsDetailAddState.goodsDetailForm.smId = null
- goodsDetailAddState.classifyList = goodsDetailAddState.departmentList.find(item => item.depId === value)?.classificationList as Array<ClassificationListType>
-}
+// const changeDepartment = (value: number | null) => {
+// goodsDetailAddState.classifyId = null
+// goodsDetailAddState.goodsDetailForm.smId = null
+// goodsDetailAddState.classifyList = goodsDetailAddState.departmentList.find(item => item.depId === value)?.classificationList as Array<ClassificationListType>
+// }
const changeClassify = (value: number | null) => {
goodsDetailAddState.goodsDetailForm.smId = null
- goodsDetailAddState.goodsList = goodsDetailAddState.classifyList.find(item => item.materialClassifyId === value)?.baseMaterialList as Array<BaseMaterialListType>
+ goodsDetailAddState.goodsList = JSON.parse(JSON.stringify(
+ (goodsDetailAddState.classifyList.find(item => item.materialClassifyId === value) ?? {baseMaterialList:[]})?.baseMaterialList as Array<BaseMaterialListType>
+ ))
}
const submitGoodsDetail = () => {
diff --git a/src/views/facilityManagement/goodsDetailManage/components/goodsDetailEdit.vue b/src/views/facilityManagement/goodsDetailManage/components/goodsDetailEdit.vue
index 3fe4fd8..c684721 100644
--- a/src/views/facilityManagement/goodsDetailManage/components/goodsDetailEdit.vue
+++ b/src/views/facilityManagement/goodsDetailManage/components/goodsDetailEdit.vue
@@ -13,22 +13,22 @@
<el-col :span="24" class="mb20">
<el-form-item label="选择物资" prop="smId">
<el-row :gutter="6">
- <el-col :span="8">
- <el-select
- filterable
- placeholder="请选择部门"
- clearable
- @change="changeDepartment"
- v-model="goodsDetailEditState.depId">
- <el-option
- v-for="item in goodsDetailEditState.departmentList"
- :key="item.depId"
- :value="item.depId"
- :label="item.depName"
- ></el-option>
- </el-select>
- </el-col>
- <el-col :span="8">
+<!-- <el-col :span="8">-->
+<!-- <el-select-->
+<!-- filterable-->
+<!-- placeholder="请选择部门"-->
+<!-- clearable-->
+<!-- @change="changeDepartment"-->
+<!-- v-model="goodsDetailEditState.depId">-->
+<!-- <el-option-->
+<!-- v-for="item in goodsDetailEditState.departmentList"-->
+<!-- :key="item.depId"-->
+<!-- :value="item.depId"-->
+<!-- :label="item.depName"-->
+<!-- ></el-option>-->
+<!-- </el-select>-->
+<!-- </el-col>-->
+ <el-col :span="12">
<el-select v-model="goodsDetailEditState.classifyId" placeholder="选择分类" @change="changeClassify" filterable clearable>
<el-option
v-for="item in goodsDetailEditState.classifyList"
@@ -38,7 +38,7 @@
></el-option>
</el-select>
</el-col>
- <el-col :span="8">
+ <el-col :span="12">
<el-select v-model="goodsDetailEditState.goodsDetailForm.smId" placeholder="选择物资" filterable clearable>
<el-option
v-for="item in goodsDetailEditState.goodsList"
@@ -101,8 +101,10 @@
import {isValidKey} from "/@/views/facilityManagement/safetyGoodsAndEquipment/index";
import {ElMessage} from "element-plus/es";
import {goodsDetailApi} from "/@/api/facilityManagement/goodsDetailManage";
+import {useUserInfo} from "/@/stores/userInfo";
const goodsDetailFormRef = ref()
+const userInfo = useUserInfo()
const goodsDetailEditState = reactive<GoodsDetailEditType>({
title: '编辑',
@@ -128,7 +130,6 @@
})
// watch(() => goodsDetailEditState.depId ,(newVal, oldVal) => {
-// debugger
// goodsDetailEditState.classify = null
// goodsDetailEditState.goodsDetailForm.smId = null
// goodsDetailEditState.classifyList = goodsDetailEditState.departmentList.find(item => item.depId === newVal)?.classificationList as Array<ClassificationListType>
@@ -140,7 +141,7 @@
setTimeout(() => {
goodsDetailFormRef.value.clearValidate();
});
- await changeDepartment(value.depId)
+ await changeDepartment(userInfo.userInfos.depId)
await changeClassify(value.bigClassifyId)
goodsDetailEditState.depId = value.depId
goodsDetailEditState.classifyId = value.bigClassifyId
@@ -156,7 +157,9 @@
const changeDepartment = (value: number | null) => {
goodsDetailEditState.classifyId = null
goodsDetailEditState.goodsDetailForm.smId = null
- goodsDetailEditState.classifyList = goodsDetailEditState.departmentList.find(item => item.depId === value)?.classificationList as Array<ClassificationListType>
+ goodsDetailEditState.classifyList = JSON.parse(JSON.stringify(
+ (goodsDetailEditState.departmentList.find(item => item.depId === value) ?? {classificationList:[]})?.classificationList as Array<ClassificationListType>
+ ))
}
const changeClassify = (value: number | null) => {
diff --git a/src/views/facilityManagement/goodsDetailManage/index.ts b/src/views/facilityManagement/goodsDetailManage/index.ts
index 12aedfd..adde520 100644
--- a/src/views/facilityManagement/goodsDetailManage/index.ts
+++ b/src/views/facilityManagement/goodsDetailManage/index.ts
@@ -90,7 +90,7 @@
materialName: string;
checkOutForm: {
id?: null | number;
- claimantId: null | number;
+ receiveUid: null | number;
ids?: Array<number>;
};
// checkOutMoreForm: {
diff --git a/src/views/facilityManagement/goodsTypeManage/index.vue b/src/views/facilityManagement/goodsTypeManage/index.vue
new file mode 100644
index 0000000..a994107
--- /dev/null
+++ b/src/views/facilityManagement/goodsTypeManage/index.vue
@@ -0,0 +1,435 @@
+<template>
+ <div class="home-container">
+ <div style="height: 100%">
+ <el-row class="homeCard">
+ <div class="basic-line">
+ </div>
+ <div class="basic-line">
+ </div>
+ <div style="padding-bottom: 10px">
+ <el-button size="default" type="primary" @click="onOpenGoodsClassifyDialog('新增', '')">
+ <el-icon>
+ <ele-FolderAdd />
+ </el-icon>
+ 新增分类
+ </el-button>
+ </div>
+ </el-row>
+ <div class="homeCard">
+ <div class="main-card">
+ <el-table
+ :data="addGoodsState.goodsData"
+ style="width: 100%"
+ height="calc(100% - 100px)"
+ :header-cell-style="{ background: '#fafafa' }"
+ border
+ row-key="id"
+ :load="load"
+ :row-class-name="tableRowClassName"
+ :tree-props="{ children: 'childList', hasChildren: true }"
+ >
+ <el-table-column prop="materialClassifyName" label="分类名称" show-overflow-tooltip align="center"/>
+ <el-table-column prop="consumableName" label="是否耗材" show-overflow-tooltip align="center"/>
+ <el-table-column prop="materialClassifyName" label="类别" show-overflow-tooltip align="center">
+ <template #default="scope">
+ <div v-if="scope.row.parentId === 0">{{'分类名称'}}</div>
+ <div v-if="scope.row.parentId !== 0">{{'物资名称'}}</div>
+ </template>
+ </el-table-column>
+ <el-table-column label="操作" width="150" align="center">
+ <template #default="scope">
+ <el-button v-if="scope.row.parentId === 0" size="small" text type="primary" @click="onOpenGoodsClassifyDialog('新增物资', scope.row)">
+ <el-icon>
+ <ele-FolderAdd />
+ </el-icon>
+ 新增物资
+ </el-button>
+ <el-button size="small" text type="primary" :icon="Edit" @click="onOpenGoodsClassifyDialog('编辑', scope.row)">编辑</el-button>
+ <el-button size="small" text type="danger" :icon="Delete" @click="deleteGoodsClassify(scope.row)">删除</el-button>
+ </template>
+ </el-table-column>
+ </el-table>
+ <br />
+ <el-pagination @size-change="onHandleSizeChange" @current-change="onHandleCurrentChange" :pager-count="5" :page-sizes="[5, 10, 20]" v-model:current-page="addGoodsState.listQuery.pageIndex" background v-model:page-size="addGoodsState.listQuery.pageSize" layout="total, sizes, prev, pager, next, jumper" :total="addGoodsState.total" class="page-position" style="padding-top: 20px;"> </el-pagination>
+ </div>
+ </div>
+ </div>
+ <el-dialog :title="addGoodsState.goodsClassifyTitle" :close-on-click-modal="false" v-model="addGoodsState.showAddGoodsClassifyDialog" width="30%">
+ <el-form
+ :model="addGoodsState.goodsClassifyForm"
+ :rules="addGoodsState.goodsClassifyRules"
+ ref="goodsClassifyRef"
+ size="default"
+ label-width="120px">
+ <el-row>
+ <el-col :span="24" class="mb20" v-if="!addGoodsState.goodsClassifyForm.parentId">
+ <el-form-item label="分类名称" prop="materialClassifyName">
+ <el-input v-model="addGoodsState.goodsClassifyForm.materialClassifyName" placeholder="输入分类名称" class="input-add">
+ </el-input>
+ </el-form-item>
+ </el-col>
+ <el-col :span="24" class="mb20" v-if="addGoodsState.goodsClassifyForm.parentId">
+ <el-form-item label="物资名称" prop="materialClassifyName">
+ <el-input v-model="addGoodsState.goodsClassifyForm.materialClassifyName" placeholder="输入物资名称" class="input-add">
+ </el-input>
+ </el-form-item>
+ </el-col>
+ <el-col :span="24" class="mb20" v-if="addGoodsState.goodsClassifyForm.parentId">
+ <el-form-item label="是否耗材" prop="consumable">
+ <el-select class="input-add" v-model="addGoodsState.goodsClassifyForm.consumable" placeholder="是否耗材" clearable filterable>
+ <el-option
+ v-for="item in addGoodsState.consumableList"
+ :key="item.id"
+ :value="item.id"
+ :label="item.name"
+ >
+ </el-option>
+ </el-select>
+ </el-form-item>
+ </el-col>
+ </el-row>
+ </el-form>
+ <template #footer>
+ <span class="dialog-footer">
+ <el-button @click="addGoodsState.showAddGoodsClassifyDialog = !addGoodsState.showAddGoodsClassifyDialog" size="default">取 消</el-button>
+ <el-button type="primary" @click="submitGoodsClassify" v-throttle size="default">确 定</el-button>
+ </span>
+ </template>
+ </el-dialog>
+ </div>
+</template>
+
+<script setup lang="ts">
+import {computed, nextTick, onMounted, reactive, ref, watch} from 'vue'
+import { Edit, Delete, } from '@element-plus/icons-vue';
+import {AddGoodsStateType, BigClassifyType} from "/@/views/facilityManagement/safetyGoodsAndEquipment/index";
+import {mount} from "sortablejs";
+import {goodsAndEquipmentApi} from "/@/api/facilityManagement/safetyGoodsAndEquipment";
+import {ElMessage, valueEquals} from "element-plus/es";
+import {ElMessageBox} from "element-plus";
+import {inspectTaskApi} from "/@/api/intellectInspectSystem/inspectTask";
+
+const addGoodsState = reactive<AddGoodsStateType>({
+ title:'',
+ goodsClassifyTitle:'',
+ showAddGoodsDialog: false,
+ showAddGoodsClassifyDialog: false,
+ activeName: 'goodsInformation',
+ goodsData: [],
+ goodsBigClassifyList: [],
+ consumableList: [
+ {id: 0, name: '是'},
+ {id: 1, name: '否'},
+ ],
+ total:0,
+ listQuery:{
+ pageSize: 10,
+ pageIndex: 1,
+ searchParams: {
+ classifyName:''
+ }
+ },
+ goodsClassifyForm: {
+ id: null,
+ materialClassifyName: '',
+ parentId: null,
+ consumable: null,
+ },
+ goodsClassifyRules: {
+
+ },
+});
+
+const openAddGoodsDialog = (goodsBigClassifyList: BigClassifyType []) => {
+ addGoodsState.showAddGoodsDialog = true
+ addGoodsState.goodsBigClassifyList = goodsBigClassifyList
+ getGoodsClassifyDataByPage()
+}
+
+const onOpenGoodsClassifyDialog = (title: string, value:BigClassifyType ) => {
+ addGoodsState.showAddGoodsClassifyDialog = true
+ addGoodsState.goodsClassifyForm = {
+ id: null,
+ materialClassifyName: '',
+ parentId: null,
+ }
+ if(title === '新增') {
+ addGoodsState.goodsClassifyTitle = '新增分类'
+ }else if(title === '新增物资'){
+ addGoodsState.goodsClassifyTitle = `新增${value.materialClassifyName}`
+ addGoodsState.goodsClassifyForm.parentId = value.id
+ } else if(title === '编辑' && value.parentId === 0){
+ addGoodsState.goodsClassifyTitle = '编辑分类'
+ addGoodsState.goodsClassifyForm = {
+ id: value.id,
+ materialClassifyName: value.materialClassifyName,
+ consumable: null,
+ parentId: null,
+ }
+ }else {
+ addGoodsState.goodsClassifyTitle = `编辑${addGoodsState.goodsBigClassifyList.find(item => item.id === value.parentId)?.materialClassifyName as string}`
+ addGoodsState.goodsClassifyForm.parentId = addGoodsState.goodsBigClassifyList.find(item => item.id === value.parentId)?.id as number
+ addGoodsState.goodsClassifyForm.materialClassifyName = value.materialClassifyName
+ addGoodsState.goodsClassifyForm.consumable = value.consumable
+ addGoodsState.goodsClassifyForm.id = value.id
+ }
+}
+
+const submitGoodsClassify = async () => {
+ if(addGoodsState.goodsClassifyTitle.substring(0,2) === '新增'){
+ let res = await goodsAndEquipmentApi().addGoodsClassify(addGoodsState.goodsClassifyForm);
+ if(res.data.code === '200'){
+ addGoodsState.showAddGoodsClassifyDialog = false;
+ await getGoodsClassifyDataByPage();
+ ElMessage({
+ type: 'success',
+ message: '新增成功',
+ duration: 2000
+ });
+ }else{
+ ElMessage({
+ type:'warning',
+ message:res.data.msg
+ })
+ }
+ }else{
+ let res = await goodsAndEquipmentApi().updateGoodsClassify(addGoodsState.goodsClassifyForm);
+ if(res.data.code === '200'){
+ addGoodsState.showAddGoodsClassifyDialog = false;
+ await getGoodsClassifyDataByPage();
+ emit('refreshClassify')
+ ElMessage({
+ type: 'success',
+ message: '编辑成功',
+ duration: 2000
+ });
+ }else{
+ ElMessage({
+ type:'warning',
+ message:res.data.msg
+ })
+ }
+ }
+};
+
+const deleteGoodsClassify = (row: BigClassifyType) => {
+ ElMessageBox.confirm(`此操作将永久删除该:“${row.materialClassifyName}”,是否继续?`, '提示', {
+ confirmButtonText: '确认',
+ cancelButtonText: '取消',
+ type: 'warning'
+ })
+ .then(async () => {
+ let res = await goodsAndEquipmentApi().deleteGoodsClassify({ id: row.id });
+ if (res.data.code === '200') {
+ ElMessage({
+ type: 'success',
+ duration: 2000,
+ message: '删除成功'
+ });
+ await getGoodsClassifyDataByPage();
+ } else {
+ ElMessage({
+ type: 'warning',
+ message: res.data.msg
+ });
+ }
+ })
+ .catch(() => {});
+};
+
+const getGoodsClassifyDataByPage = async () => {
+ let res = await goodsAndEquipmentApi().getAllSafetyEquipmentByPage(addGoodsState.listQuery);
+ if(res.data.code === '200'){
+ addGoodsState.goodsData = res.data.data
+ addGoodsState.total = res.data.total
+ }else{
+ ElMessage({
+ message:res.data.msg,
+ type:'warning'
+ })
+ }
+}
+
+const getAllSafetyEquipmentList = async () => {
+ let res = await goodsAndEquipmentApi().getAllSafetyEquipment();
+ if(res.data.code === '200'){
+ addGoodsState.goodsBigClassifyList = JSON.parse(JSON.stringify(res.data.data))
+ }else{
+ ElMessage({
+ message:res.data.msg,
+ type:'warning'
+ })
+ }
+}
+
+const tableRowClassName = ( row: {rowIndex: number, row: BigClassifyType } ) => {
+ if (row.row.parentId === 0) {
+ return 'big-row';
+ } else{
+ return 'small-row';
+ }
+}
+
+const onHandleSizeChange = (val: number) => {
+ addGoodsState.listQuery.pageSize = val
+ getGoodsClassifyDataByPage()
+}
+
+const onHandleCurrentChange = (val: number) => {
+ addGoodsState.listQuery.pageIndex = val
+ getGoodsClassifyDataByPage()
+}
+
+const load = (
+ row: BigClassifyType,
+ treeNode: unknown,
+ resolve: (date: BigClassifyType[]) => void
+) => {
+ setTimeout(() => {
+ resolve([])
+ }, 1000)
+}
+
+const emit = defineEmits(['refreshClassify'])
+
+defineExpose({
+ openAddGoodsDialog,
+});
+
+onMounted( () => {
+ getGoodsClassifyDataByPage();
+ getAllSafetyEquipmentList();
+})
+</script>
+
+<style scoped lang="scss">
+$homeNavLengh: 8;
+.home-container {
+ height: calc(100vh - 144px);
+ box-sizing: border-box;
+ overflow: hidden;
+ .homeCard {
+ width: 100%;
+ padding: 20px;
+ box-sizing: border-box;
+ background: #fff;
+ border-radius: 4px;
+
+ .main-card {
+ width: 100%;
+ height: 100%;
+ .cardTop {
+ display: flex;
+ align-items: center;
+ justify-content: space-between;
+ margin-bottom: 20px;
+ .mainCardBtn {
+ margin: 0;
+ }
+ }
+ .pageBtn {
+ height: 60px;
+ display: flex;
+ align-items: center;
+ justify-content: right;
+
+ .demo-pagination-block + .demo-pagination-block {
+ margin-top: 10px;
+ }
+ .demo-pagination-block .demonstration {
+ margin-bottom: 16px;
+ }
+ }
+ }
+ &:last-of-type {
+ height: calc(100% - 100px);
+ }
+ }
+ .el-row {
+ display: flex;
+ align-items: center;
+ margin-bottom: 20px;
+ &:last-child {
+ margin-bottom: 0;
+ }
+ .grid-content {
+ align-items: center;
+ min-height: 36px;
+ }
+
+ .topInfo {
+ display: flex;
+ align-items: center;
+ font-size: 16px;
+ font-weight: bold;
+
+ & > div {
+ white-space: nowrap;
+ margin-right: 20px;
+ }
+ }
+ }
+}
+.stepItem {
+ width: 100%;
+ display: flex;
+ align-items: flex-start;
+ margin-bottom: 30px;
+ margin-left: 30px;
+ padding-bottom: 30px;
+ border-left: 2px solid #ccc;
+ &:first-of-type {
+ margin-top: 30px;
+ }
+ &:last-of-type {
+ margin-bottom: 0;
+ border-left: none;
+ }
+ .stepNum {
+ width: 30px;
+ height: 30px;
+ border-radius: 15px;
+ box-sizing: border-box;
+ color: #333;
+ border: 1px solid #999;
+ line-height: 28px;
+ text-align: center;
+ margin-right: 10px;
+ margin-left: -16px;
+ margin-top: -30px;
+ }
+ .stepCard {
+ width: 100%;
+ margin-top: -30px;
+
+ .box-card {
+ width: 100%;
+ &:deep(.el-card__header) {
+ padding: 10px 15px;
+ }
+ .card-header {
+ width: 100%;
+ display: flex;
+ justify-content: space-between;
+ align-items: center;
+ & > div:first-of-type {
+ margin-right: 80px;
+ font-size: 18px;
+ font-weight: bold;
+ }
+ }
+ }
+ }
+ &:hover .card-header {
+ color: #0098f5;
+ }
+ &:hover .stepNum {
+ border: 2px solid #0098f5;
+ color: #0098f5;
+ }
+}
+:deep(.el-table .big-row) {
+ font-size: 16px !important;
+ font-weight: 700;
+}
+</style>
diff --git a/src/views/facilityManagement/safetyGoodsAndEquipment/components/addGoodsDialog.vue b/src/views/facilityManagement/safetyGoodsAndEquipment/components/addGoodsDialog.vue
index eb05a5f..55a5571 100644
--- a/src/views/facilityManagement/safetyGoodsAndEquipment/components/addGoodsDialog.vue
+++ b/src/views/facilityManagement/safetyGoodsAndEquipment/components/addGoodsDialog.vue
@@ -168,6 +168,7 @@
if(res.data.code === '200'){
addGoodsState.showAddGoodsClassifyDialog = false;
await getGoodsClassifyDataByPage();
+ emit('refreshClassify')
ElMessage({
type: 'success',
message: '编辑成功',
@@ -248,6 +249,8 @@
}, 1000)
}
+const emit = defineEmits(['refreshClassify'])
+
defineExpose({
openAddGoodsDialog,
});
diff --git a/src/views/facilityManagement/safetyGoodsAndEquipment/components/batchInStorage.vue b/src/views/facilityManagement/safetyGoodsAndEquipment/components/batchInStorage.vue
index 1274271..a6d17da 100644
--- a/src/views/facilityManagement/safetyGoodsAndEquipment/components/batchInStorage.vue
+++ b/src/views/facilityManagement/safetyGoodsAndEquipment/components/batchInStorage.vue
@@ -40,8 +40,9 @@
<el-form-item label="有效期至:" prop="validTime">
<el-date-picker
v-model="batchInStorageState.inStorageData.validTime"
- format="YYYY-MM-DD"
- value-format="YYYY-MM-DD"
+ type="datetime"
+ format="YYYY-MM-DD HH:mm:ss"
+ value-format="YYYY-MM-DD HH:mm:ss"
placeholder="选择日期时间"
style="width: 90%" />
</el-form-item>
@@ -94,9 +95,9 @@
}
const submitInStorageData = () => {
+ batchInStorageState.loading = true;
inStorageDataRef.value.validate(async (valid: boolean) => {
if(valid){
- batchInStorageState.loading = true;
let res = await goodsAndEquipmentApi().batchInStorageGoods(batchInStorageState.inStorageData);
if(res.data.code === '200'){
batchInStorageState.batchInStorageDialogVisible = false;
@@ -112,7 +113,6 @@
message:res.data.msg
});
}
- batchInStorageState.loading = false
}else{
ElMessage({
type: 'warning',
@@ -120,6 +120,7 @@
});
}
});
+ batchInStorageState.loading = false;
};
const emit = defineEmits(['refreshData',]);
diff --git a/src/views/facilityManagement/safetyGoodsAndEquipment/components/batchOutStorage.vue b/src/views/facilityManagement/safetyGoodsAndEquipment/components/batchOutStorage.vue
index b1e4873..235beb3 100644
--- a/src/views/facilityManagement/safetyGoodsAndEquipment/components/batchOutStorage.vue
+++ b/src/views/facilityManagement/safetyGoodsAndEquipment/components/batchOutStorage.vue
@@ -29,8 +29,8 @@
</el-form-item>
</el-col>
<el-col :span="24" class="mb20">
- <el-form-item label="认领人:" prop="claimantId">
- <el-select class="input-add" v-model="batchOutStorageState.outStorageData.claimantId" placeholder="选择认领人">
+ <el-form-item label="认领人:" prop="receiveUid">
+ <el-select class="input-add" v-model="batchOutStorageState.outStorageData.receiveUid" placeholder="选择认领人">
<el-option
v-for="item in batchOutStorageState.userList"
:key="item.uid"
@@ -70,12 +70,12 @@
outStorageData:{
smId: null,
count: null,
- claimantId: null,
+ receiveUid: null,
rfid: null,
},
outStorageDataRules: {
count: [{ required: true, message: '请填写出库数量', trigger: 'blur' }],
- claimantId: [{ required: true, message: '请选择认领人', trigger: 'change' }],
+ receiveUid: [{ required: true, message: '请选择认领人', trigger: 'change' }],
},
userList: [],
})
@@ -87,9 +87,9 @@
}
const submitOutStorageData = () => {
+ batchOutStorageState.loading = true;
outStorageDataRef.value.validate(async (valid: boolean) => {
if(valid){
- batchOutStorageState.loading = true;
let res = await goodsAndEquipmentApi().batchOutStorageGoods(batchOutStorageState.outStorageData);
if(res.data.code === '200'){
batchOutStorageState.batchOutStorageDialogVisible = false;
@@ -105,7 +105,6 @@
message:res.data.msg
});
}
- batchOutStorageState.loading = false
}else{
ElMessage({
type: 'warning',
@@ -113,6 +112,7 @@
});
}
});
+ batchOutStorageState.loading = false
};
const emit = defineEmits(['refreshData',]);
diff --git a/src/views/facilityManagement/safetyGoodsAndEquipment/components/safetyGoodsAndEquipmentDialog.vue b/src/views/facilityManagement/safetyGoodsAndEquipment/components/safetyGoodsAndEquipmentDialog.vue
index 4ace281..54fc08e 100644
--- a/src/views/facilityManagement/safetyGoodsAndEquipment/components/safetyGoodsAndEquipmentDialog.vue
+++ b/src/views/facilityManagement/safetyGoodsAndEquipment/components/safetyGoodsAndEquipmentDialog.vue
@@ -10,7 +10,7 @@
element-loading-text="Loading..."
label-width="120px">
<el-row>
- <el-col :span="18" class="mb20">
+ <el-col :span="24" class="mb20">
<el-form-item label="物资大类" prop="bigClassifyId">
<el-select v-model="dialogState.safetyGoodsAndEquipmentForm.bigClassifyId" @change="changeSmallClassify(null)" placeholder="物资大类" class="input-add">
<el-option
@@ -22,10 +22,9 @@
</el-select>
</el-form-item>
</el-col>
- <el-col :span="5">
- <el-button type="primary" @click="openAddGoods">添加物资</el-button>
- </el-col>
-
+<!-- <el-col :span="5">-->
+<!-- <el-button type="primary" @click="openAddGoods">添加物资</el-button>-->
+<!-- </el-col>-->
<el-col :xs="24" :sm="24" :md="24" :lg="24" :xl="24" class="mb20">
<el-form-item label="物资小类" prop="smallClassifyId">
<el-select class="input-add" v-model="dialogState.safetyGoodsAndEquipmentForm.smallClassifyId" placeholder="请先选择物资大类">
@@ -42,6 +41,7 @@
<el-col :xs="24" :sm="24" :md="24" :lg="24" :xl="24" class="mb20">
<el-form-item label="部门" prop="depId">
<el-cascader
+ :disabled="true"
:options="dialogState.departmentList"
:props="{ emitPath: false, checkStrictly: true, value: 'depId', label: 'depName' }"
placeholder="请选择部门"
@@ -51,19 +51,19 @@
</el-cascader>
</el-form-item>
</el-col>
- <el-col :xs="24" :sm="24" :md="24" :lg="24" :xl="24" class="mb20">
- <el-form-item label="是否耗材" prop="consumable">
- <el-select class="input-add" v-model="dialogState.safetyGoodsAndEquipmentForm.consumable" placeholder="是否耗材" clearable filterable>
- <el-option
- v-for="item in dialogState.consumableList"
- :key="item.id"
- :value="item.id"
- :label="item.name"
- >
- </el-option>
- </el-select>
- </el-form-item>
- </el-col>
+<!-- <el-col :xs="24" :sm="24" :md="24" :lg="24" :xl="24" class="mb20">-->
+<!-- <el-form-item label="是否耗材" prop="consumable">-->
+<!-- <el-select class="input-add" v-model="dialogState.safetyGoodsAndEquipmentForm.consumable" placeholder="是否耗材" clearable filterable>-->
+<!-- <el-option-->
+<!-- v-for="item in dialogState.consumableList"-->
+<!-- :key="item.id"-->
+<!-- :value="item.id"-->
+<!-- :label="item.name"-->
+<!-- >-->
+<!-- </el-option>-->
+<!-- </el-select>-->
+<!-- </el-form-item>-->
+<!-- </el-col>-->
</el-row>
</el-form>
<template #footer>
@@ -73,7 +73,7 @@
</span>
</template>
</el-dialog>
- <add-goods-dialog ref="addGoodsDialogRef"></add-goods-dialog>
+ <add-goods-dialog ref="addGoodsDialogRef" @refreshClassify="getAllSafetyEquipmentList"></add-goods-dialog>
</div>
</template>
@@ -88,9 +88,11 @@
import { goodsAndEquipmentApi } from "/@/api/facilityManagement/safetyGoodsAndEquipment";
import {ElMessage} from "element-plus";
import AddGoodsDialog from "./addGoodsDialog.vue";
+import {useUserInfo} from "/@/stores/userInfo";
const safetyGoodsAndEquipmentRef = ref();
-const addGoodsDialogRef = ref()
+const addGoodsDialogRef = ref();
+const userInfo = useUserInfo()
const dialogState = reactive<SafetyGoodsAndEquipmentDialogStateType>({
safetyGoodsAndEquipmentForm: {
@@ -98,13 +100,13 @@
bigClassifyId: null,
smallClassifyId: null,
depId: null,
- consumable: null,
+ // consumable: null,
},
safetyGoodsAndEquipmentRules: {
bigClassifyId: [{ required: true, message: '请选择物资大类', trigger: 'change' }],
smallClassifyId: [{ required: true, message: '请选择物资小类', trigger: 'change' }],
- depId: [{ required: true, message: '请选择部门', trigger: 'change' }],
- consumable: [{ required: true, message: '请选择是否耗材', trigger: 'change' }],
+ // depId: [{ required: true, message: '请选择部门', trigger: 'change' }],
+ // consumable: [{ required: true, message: '请选择是否耗材', trigger: 'change' }],
},
showSafetyGoodsAndEquipmentDialog: false,
title: '',
@@ -123,9 +125,9 @@
},);
-const openAddGoods = () => {
- addGoodsDialogRef.value.openAddGoodsDialog(dialogState.goodsBigClassifyList)
-}
+// const openAddGoods = () => {
+// addGoodsDialogRef.value.openAddGoodsDialog(dialogState.goodsBigClassifyList)
+// }
const openSafetyGoodsAndEquipmentDialog =
(title: string, value: safetyGoodsAndEquipmentFormType, goodsBigClassifyList: BigClassifyType [], departmentList : DepartmentType []) => {
@@ -137,9 +139,12 @@
id: null,
bigClassifyId: null,
smallClassifyId: null,
- depId: null,
- consumable: null,
+ depId: userInfo.userInfos.depId,
+ // consumable: null,
};
+ nextTick( () => {
+ safetyGoodsAndEquipmentRef.value.clearValidate();
+ })
if(title === '新增') {
dialogState.title = '新增'
}else {
@@ -206,6 +211,18 @@
})
};
+const getAllSafetyEquipmentList = async () => {
+ let res = await goodsAndEquipmentApi().getAllSafetyEquipment();
+ if(res.data.code === '200'){
+ dialogState.goodsBigClassifyList = res.data.data
+ }else{
+ ElMessage({
+ message:res.data.msg,
+ type:'warning'
+ })
+ }
+};
+
const emit = defineEmits(['refreshData',])
defineExpose({
diff --git a/src/views/facilityManagement/safetyGoodsAndEquipment/index.ts b/src/views/facilityManagement/safetyGoodsAndEquipment/index.ts
index 3772b41..63748a4 100644
--- a/src/views/facilityManagement/safetyGoodsAndEquipment/index.ts
+++ b/src/views/facilityManagement/safetyGoodsAndEquipment/index.ts
@@ -36,6 +36,7 @@
activeName: string;
goodsData: BigClassifyType [];
goodsBigClassifyList: BigClassifyType [];
+ consumableList?: Type [];
total: number;
listQuery: {
pageSize: number;
@@ -48,6 +49,7 @@
id: null | number;
materialClassifyName: string;
parentId: number | null;
+ consumable?: number | null;
};
goodsClassifyRules: {
@@ -78,7 +80,7 @@
outStorageData: {
smId: null | number,
count: null | number,
- claimantId: null | number,
+ receiveUid: null | number,
rfid: null | string,
};
outStorageDataRules: {
@@ -96,7 +98,7 @@
bigClassifyId: null | number,
smallClassifyId: null | number,
depId: null | number,
- consumable: null | number,
+ // consumable: null | number,
}
export type DataType = {
@@ -119,6 +121,7 @@
export type BigClassifyType = {
id: number;
materialClassifyName: string;
+ consumable?: number | null;
parentId?: number;
childList?: BigClassifyType [];
}
diff --git a/src/views/facilityManagement/safetyGoodsAndEquipment/index.vue b/src/views/facilityManagement/safetyGoodsAndEquipment/index.vue
index d47495a..a2ba323 100644
--- a/src/views/facilityManagement/safetyGoodsAndEquipment/index.vue
+++ b/src/views/facilityManagement/safetyGoodsAndEquipment/index.vue
@@ -2,15 +2,21 @@
<div class="home-container">
<div style="height: 100%">
<el-row class="homeCard">
-<!-- <div class="basic-line">-->
-<!-- <span>设备区域名称:</span>-->
-<!-- <el-input class="input-box" v-model="tableData.listQuery.regionName" placeholder="设备区域名称" clearable> </el-input>-->
-<!-- </div>-->
-<!-- <div class="basic-line">-->
-<!-- <span>设备区域类型:</span>-->
-<!-- <el-select class="input-box" v-model="tableData.listQuery.regionTypeId" placeholder="设备区域类型" filterable>-->
-<!-- </el-select>-->
-<!-- </div>-->
+ <div class="basic-line">
+ <span>分类名称:</span>
+ <el-select class="input-box" v-model="tableData.listQuery.searchParams.bigClassifyId" placeholder="分类名称" filterable>
+ <el-option
+ v-for="item in tableData.goodsBigClassifyList"
+ :key="item.id"
+ :value="item.id"
+ :label="item.materialClassifyName"
+ ></el-option>
+ </el-select>
+ </div>
+ <div class="basic-line">
+ <span>物资名称:</span>
+ <el-input class="input-box" v-model="tableData.listQuery.searchParams.materialName" placeholder="物资名称" clearable> </el-input>
+ </div>
<div style="padding-bottom: 10px">
<el-button size="large" type="primary" class="ml10" v-throttle @click="refreshGoodsAndEquipmentData">
<el-icon>
@@ -24,9 +30,9 @@
</el-icon>
新增
</el-button>
- <el-button size="large" class="ml10" @click="openAddGoods()">
- 管理分类
- </el-button>
+<!-- <el-button size="large" class="ml10" @click="openAddGoods()">-->
+<!-- 管理分类-->
+<!-- </el-button>-->
</div>
</el-row>
<div class="homeCard">
@@ -38,7 +44,7 @@
<el-table-column prop="serialNum" label="序列号" show-overflow-tooltip></el-table-column>
<el-table-column prop="depName" label="部门名称" show-overflow-tooltip></el-table-column>
<el-table-column prop="consumableName" label="是否是耗材" show-overflow-tooltip></el-table-column>
- <el-table-column prop="validStockCount" label="库存" show-overflow-tooltip></el-table-column>
+ <el-table-column prop="stockCount" label="库存" show-overflow-tooltip></el-table-column>
<el-table-column label="操作" width="250" align="center">
<template #default="scope">
<el-button size="small" text type="success" :icon="Edit" @click="openBatchInStorage('批量入库', scope.row)">批量入库</el-button>
@@ -57,7 +63,7 @@
<safety-goods-and-equipment-dialog ref="safetyGoodsAndEquipmentDialogRef" @refreshData="refreshGoodsAndEquipmentData"></safety-goods-and-equipment-dialog>
<batch-out-storage ref="batchOutStorageRef" @refreshData="refreshGoodsAndEquipmentData"></batch-out-storage>
<batch-in-storage ref="batchInStorageRef" @refreshData="refreshGoodsAndEquipmentData"></batch-in-storage>
- <add-goods-dialog ref="addGoodsDialogRef"></add-goods-dialog>
+ <add-goods-dialog ref="addGoodsDialogRef" @refreshClassify="getAllSafetyEquipmentList"></add-goods-dialog>
</div>
</template>
@@ -119,9 +125,9 @@
batchOutStorageRef.value.openBatchOutStorageDialog(value)
}
-const openAddGoods = () => {
- addGoodsDialogRef.value.openAddGoodsDialog(tableData.goodsBigClassifyList)
-}
+// const openAddGoods = () => {
+// addGoodsDialogRef.value.openAddGoodsDialog(tableData.goodsBigClassifyList)
+// }
const linkToGoodsDetail = (title: string, value: DataType) => {
router.push({ path: '/goodsDetailManage', query:{ id: value.id } });
@@ -169,7 +175,7 @@
const getAllSafetyEquipmentList = async () => {
let res = await goodsAndEquipmentApi().getAllSafetyEquipment();
if(res.data.code === '200'){
- tableData.goodsBigClassifyList = res.data.data
+ tableData.goodsBigClassifyList = JSON.parse(JSON.stringify(res.data.data))
}else{
ElMessage({
message:res.data.msg,
@@ -323,4 +329,15 @@
color: #0098f5;
}
}
+
+:deep(.el-textarea.is-disabled .el-textarea__inner) {
+ background-color: var(--el-card-bg-color);
+ color: var(--el-input-text-color, var(--el-text-color-regular));
+}
+:deep(.el-input.is-disabled .el-input__inner) {
+ color: var(--el-input-text-color, var(--el-text-color-regular));
+}
+:deep(.el-input.is-disabled .el-input__wrapper) {
+ background-color: var(--el-card-bg-color);
+}
</style>
diff --git a/src/views/loginPage/component/accountLogin.vue b/src/views/loginPage/component/accountLogin.vue
index bcbe021..167d6b1 100644
--- a/src/views/loginPage/component/accountLogin.vue
+++ b/src/views/loginPage/component/accountLogin.vue
@@ -193,6 +193,7 @@
Cookies.set('token', res.data.data.accessToken);
Cookies.set('projectId', '');
Cookies.set('uid', res.data.data.uid);
+ Cookies.set('depId', res.data.data.depId);
// Session.set('token', res.data.data.accessToken);
// Session.set('projectId', '');
// Session.set('uid', res.data.data.uid);
--
Gitblit v1.9.2