فهرست منبع

库存管理库存不足标红提示,入库管理添加退库

zoie 3 روز پیش
والد
کامیت
f0622bd1a0

+ 2 - 2
README.md

@@ -16,11 +16,11 @@
 
 考勤管理 https://erp.baozhida.cn/api/ams
 
-立项管理 https://erp.baozhida.cn///console.log/project
+立项管理 https://erp.baozhida.cn/api/project
 
 #### 测试环境
 
-https://erp.baozhida.cn/testapi/storage
+https://erptest.baozhida.cn/api
 
 ### 原型
 

+ 1 - 1
src/api/apiMapList.ts

@@ -1 +1 @@
-export const mapList = ["/salary/Reimburse/Add","/salary/Reimburse/Edit","/storage/vaildationTool/add","/storage/vaildationTool/update"]
+export const mapList = ["/salary/Reimburse/Add","/salary/Reimburse/Edit","/storage/validationTool/add","/storage/validationTool/update"]

+ 10 - 8
src/api/storehouse/index.ts

@@ -111,14 +111,16 @@ export const Storehouse_Contract_Out_List = (params: any) => $http.post('/storag
  */
 // 设备列表
 export const Storehouse_Device_List = (params: any) => $http.post('/storage/Device/List', params)
-export const validation_List = (params: any) => $http.post('/storage/vaildationTool/list', params)
-export const validation_add = (params: any) => $http.post('/storage/vaildationTool/add', params, { headers: { 'Content-Type': 'application/json' } })  //借出验证工具
-export const validation_del = (params: any) => $http.post('/storage/vaildationTool/del', params,)
-export const validation_update = (params: any) => $http.post('/storage/vaildationTool/update', params,)  //借出验证工具
-export const readvaildation = (params: any) => $http.post('/storage/vaildationTool/readvaildation', params,)
-export const updatevaildation = (params: any) => $http.post('/storage/vaildationTool/updatevaildation', params,)
-export const uploadFile = (params: any) => $http.post('/storage/vaildationTool/ImportExecl', params,)
-export const exportFile = (params: any) => $http.post('/storage/vaildationTool/exportExecl', params, { responseType: 'blob' })
+export const validation_List = (params: any) => $http.post('/storage/validationTool/list', params)
+export const validation_add = (params: any) => $http.post('/storage/validationTool/add', params, { headers: { 'Content-Type': 'application/json' } })  //借出验证工具
+export const validation_del = (params: any) => $http.post('/storage/validationTool/del', params,)
+export const validation_update = (params: any) => $http.post('/storage/validationTool/update', params,)  //借出验证工具
+export const readValidation = (params: any) => $http.post('/storage/validationTool/readValidation', params,)
+export const updateValidation = (params: any) => $http.post('/storage/validationTool/updateValidation', params,)
+export const uploadFile = (params: any) => $http.post('/storage/validationTool/ImportExcel', params,)
+export const exportFile = (params: any) => $http.post('/storage/validationTool/exportExcel', params, { responseType: 'blob' })
+
+export const validationTool_class_list = (params: any) => $http.post('/storage/validationTool/class/list', params)
 
 /**
  * 入库

+ 1 - 0
src/hooks/useDepot.ts

@@ -70,6 +70,7 @@ export interface InStorageInfoType {
 export interface InStoreageFormType {
   T_number: string
   T_depot_id: any
+  T_type: any
   T_product: any
   T_date: string
   T_remark: string

+ 4 - 1
src/views/storehouse/InventoryStatistics.vue

@@ -56,7 +56,7 @@ const columns: ColumnProps[] = [
     { prop: 'T_product_class_name', label: '产品分类' },
     { prop: 'T_product_model', label: '产品型号', ellipsis: true },
     { prop: 'T_product_spec', label: '产品规格' },
-    { prop: 'T_total', label: '库存数量' },
+    { prop: 'T_total', label: '库存数量', name: 'T_total'},
     { prop: 'operation', label: '操作', width: 80, fixed: 'right' }
 ]
 
@@ -297,6 +297,9 @@ const handleHeaderClick = async (e:any) => {
                     <template #T_product_img="{ row }">
                         <ImageCom :src="row.T_product_img" />
                     </template>
+                    <template #T_total="{ row }">
+						<el-text :type="row.T_total >= row.T_product_early_warning?'info':'danger'"> {{row.T_total}} </el-text>
+                    </template>
                     <template #right="{ row }">
                         <el-button link type="primary" size="small" :icon="List"
                             @click="previewDetail(row.T_product_id)">明细</el-button>

+ 8 - 2
src/views/storehouse/ProductionList.vue

@@ -36,6 +36,7 @@ const columns: ColumnProps[] = [
   { prop: 'T_sort', label: '序号(双击)', ellipsis: true, name: 'T_sort' },
   { prop: 'T_spec', label: '产品规格' },
   { prop: 'T_relation_sn', label: '关联SN', name: 'T_relation_sn' },
+  { prop: 'T_early_warning', label: '预警数量' },
   { prop: 'T_remark', label: '备注', name: 'T_remark' },
   { prop: 'operation', label: '操作', width: 150, fixed: 'right' }
 ]
@@ -45,7 +46,8 @@ const rules = reactive<FormRules>({
   T_class: [{ required: true, message: '请选择产品分类', trigger: 'blur' }],
   T_model: [{ required: true, message: '请输入产品型号', trigger: 'blur' }],
   T_spec: [{ required: true, message: '请选择产品规格', trigger: 'blur' }],
-  T_relation_sn: [{ required: true, message: '请选择关联SN', trigger: 'blur' }]
+  T_relation_sn: [{ required: true, message: '请选择关联SN', trigger: 'blur' }],
+  T_early_warning: [{ required: true, message: '请输入预警数量', trigger: 'blur' }]
 })
 const form = ref({
   Id: '',
@@ -55,7 +57,8 @@ const form = ref({
   T_spec: '',
   T_relation_sn: '',
   T_img: '',
-  T_remark: ''
+  T_remark: '',
+  T_early_warning: ''
 })
 
 const openDrawer = (type: string, row?: any) => {
@@ -240,6 +243,9 @@ onMounted(() => {
             <el-radio :label="0">否</el-radio>
           </el-radio-group>
         </el-form-item>
+        <el-form-item label="预警数量:" class="m-b-6" :label-width="formLabelWidth" prop="T_early_warning">
+            <el-input v-model="form.T_early_warning" type="text" autocomplete="off" placeholder="请收入预警数量" />
+        </el-form-item>
         <el-form-item label="产品图片:" class="m-b-6" :label-width="formLabelWidth" prop="T_img">
           <!-- <Upload ref="uploadRef" v-if="isNew || form.T_img" :isImg="true" :limit="1" v-model="form.T_img"></Upload> -->
           <Upload ref="uploadRef" :isImg="true" :limit="1" v-model="form.T_img" accept="image/*">

+ 30 - 30
src/views/storehouse/ValidationTool/validation.vue

@@ -1,14 +1,14 @@
 <script setup lang="ts">
 import {
-  exportFile,
-  readvaildation,
-  Storehouse_ProductClass_List,
-  updatevaildation,
-  uploadFile,
-  validation_add,
-  validation_del,
-  validation_List,
-  validation_update
+	exportFile,
+	readValidation,
+	validationTool_class_list,
+	updateValidation,
+	uploadFile,
+	validation_add,
+	validation_del,
+	validation_List,
+	validation_update
 } from '@/api/storehouse'
 import TableBase from '@/components/TableBase/index.vue'
 import { computed, onMounted, reactive, ref } from 'vue'
@@ -77,8 +77,8 @@ const deleteFun = (row: any) => {
     // eslint-disable-next-line @typescript-eslint/no-empty-function
     .catch(() => {})
 }
-//导出文件execl
-const exportExecl = async () => {
+//导出文件excel
+const exportExcel = async () => {
   try {
     const response: any = await exportFile({
       User_tokey: globalStore.GET_User_tokey,
@@ -115,7 +115,7 @@ const inStorageForm = reactive({
   T_sn: '',
   Validationnumber: '',
   T_remark: '',
-  T_class: ''
+  T_class: null
 })
 
 interface InStorageItem {
@@ -124,15 +124,15 @@ interface InStorageItem {
   T_remark: string
 }
 
-// 获取产品分类
+// 获取设备类型
 const Pruductoptions = ref<any[]>([
   {
     Id: '',
     T_name: ''
   }
 ])
-const getProductClassList = async () => {
-  const res: any = await Storehouse_ProductClass_List({ page: 1, page_z: 999 })
+const getValidationToolClassList = async () => {
+  const res: any = await validationTool_class_list({ page: 1, page_z: 999 })
   Pruductoptions.value = res.Data.Data
 }
 
@@ -148,7 +148,7 @@ const paginatedPendingItems = computed(() => {
 const rules = reactive({
   T_sn: [{ required: true, message: '请输入SN', trigger: 'blur' }],
   Validationnumber: [{ required: true, message: '请输入设备编号', trigger: 'blur' }],
-  T_class: [{ required: true, message: '请选择产品分类', trigger: 'blur' }]
+  T_class: [{ required: true, message: '请选择设备类型', trigger: 'blur' }]
 })
 const rulesrepaid = reactive({
   T_sn: [{ required: true, message: '请输入SN', trigger: 'blur' }]
@@ -169,7 +169,7 @@ const submitInStorageForm = () => {
         ElMessage.warning('已存在相同的SN,不能添加')
         return
       }
-      const result: any = await readvaildation({ sn: extractedSN })
+      const result: any = await readValidation({ sn: extractedSN })
       if ((result.Code==200)&&(result.Data.T_state == 2)) {
         //1-已出库 2-待使用  3-待维修
         ElMessage.warning('当前SN已入库不能重复入库')
@@ -198,7 +198,7 @@ const submitRepaidForm = () => {
         ElMessage.warning('已存在相同的SN,不能添加')
         return
       }
-      const result: any = await readvaildation({ sn: extractedSN })
+      const result: any = await readValidation({ sn: extractedSN })
       if (result.Code !== 200) {
         ElMessage.warning('当前SN未入库不能归还')
         return
@@ -298,7 +298,7 @@ const submitLendForm = () => {
         ElMessage.warning('已存在相同的SN,不能添加')
         return
       }
-      const result: any = await readvaildation({ sn: extractedSN })
+      const result: any = await readValidation({ sn: extractedSN })
       if (result.Code !== 200) {
         ElMessage.warning('当前SN未入库不能借出')
         return
@@ -374,7 +374,7 @@ const Repaid = () => {
 
 const previewEdit = async (row: any) => {
   showEditForm.value = true
-  const result: any = await readvaildation({ sn: row.T_sn })
+  const result: any = await readValidation({ sn: row.T_sn })
   if (result.Code === 200) {
     Object.assign(editForm, result.Data)
   } else {
@@ -385,7 +385,7 @@ const previewEdit = async (row: any) => {
 const submitEditForm = () => {
   editFormRef.value?.validate(async (valid: boolean): Promise<void> => {
     if (valid) {
-      const result: any = await updatevaildation(editForm)
+      const result: any = await updateValidation(editForm)
       if (result.Code === 200) {
         ElMessage.success('编辑成功')
         showEditForm.value = false
@@ -438,7 +438,7 @@ const submitUpload = async () => {
 }
 
 onMounted(() => {
-  getProductClassList()
+  getValidationToolClassList()
 })
 </script>
 <template>
@@ -482,8 +482,8 @@ onMounted(() => {
               />
             </el-col>
             <el-col :xl="3" :lg="3" :md="3">
-              <span class="inline-flex items-center">产品分类:</span>
-              <el-select v-model="initParam.T_class" class="w-50 m-2" clearable placeholder="请选择分类~">
+              <span class="inline-flex items-center">设备类型:</span>
+              <el-select v-model="initParam.T_class" class="w-50 m-2" clearable placeholder="请选择设备类型~">
                 <el-option v-for="item in Pruductoptions" :key="item.Id" :label="item.T_name" :value="item.Id" />
               </el-select>
             </el-col>
@@ -537,7 +537,7 @@ onMounted(() => {
               <el-button type="primary" @click="showLendForm = true">借出</el-button>
               <el-button type="primary" @click="showrRepaidForm = true">归还</el-button>
               <el-button type="success" @click="ImportEdit = true">模板导入</el-button>
-              <el-button type="success" @click="exportExecl">导出</el-button>
+              <el-button type="success" @click="exportExcel">导出</el-button>
             </el-col>
           </el-row>
         </div>
@@ -565,8 +565,8 @@ onMounted(() => {
       <el-form-item label="设备编号" prop="Validationnumber">
         <el-input v-model="inStorageForm.Validationnumber" placeholder="请输入设备编号"></el-input>
       </el-form-item>
-      <el-form-item label="产品分类" prop="T_class">
-        <el-select v-model="inStorageForm.T_class" class="w-50 m-2" clearable placeholder="请选择分类~">
+      <el-form-item label="设备类型" prop="T_class">
+        <el-select v-model="inStorageForm.T_class" class="w-50 m-2" clearable placeholder="请选择设备类型~">
           <el-option v-for="item in Pruductoptions" :key="item.Id" :label="item.T_name" :value="item.Id" />
         </el-select>
       </el-form-item>
@@ -583,7 +583,7 @@ onMounted(() => {
       <!-- 添加序号列 -->
       <el-table-column prop="T_sn" label="SN" width="300"></el-table-column>
       <el-table-column prop="Validationnumber" label="设备编号"></el-table-column>
-      <el-table-column prop="T_class" label="产品分类"></el-table-column>
+      <el-table-column prop="T_class" label="设备类型"></el-table-column>
       <el-table-column prop="T_remark" label="备注"></el-table-column>
       <el-table-column label="操作" width="180">
         <template #default="scope">
@@ -603,7 +603,7 @@ onMounted(() => {
     <template #footer>
       <span class="dialog-footer">
         <el-button @click="showInStorageForm = false">取消</el-button>
-        <el-button type="primary" @click="submitInStorageForm">添加到暂存11</el-button>
+        <el-button type="primary" @click="submitInStorageForm">添加到暂存</el-button>
         <!-- 新增提交按钮 -->
         <el-button type="primary" @click="submitInStoragePendingItems">提交</el-button>
       </span>
@@ -675,7 +675,7 @@ onMounted(() => {
         </el-select>
       </el-form-item>
       <el-form-item label="设备类型">
-        <el-select v-model="editForm.T_class" class="w-50 m-2" clearable placeholder="请选择分类~">
+        <el-select v-model="editForm.T_class" class="w-50 m-2" clearable placeholder="请选择设备类型~">
           <el-option v-for="item in Pruductoptions" :key="item.Id" :label="item.T_name" :value="item.Id" />
         </el-select>
       </el-form-item>

+ 7 - 2
src/views/storehouse/inventory/InStorage.vue

@@ -20,6 +20,7 @@ const TableRef = ref<InstanceType<typeof TableBase> | null>(null)
 const columns: ColumnProps[] = [
   { type: 'index', label: '序号', width: 80 },
   { prop: 'T_number', label: '入库单号' },
+  { prop: 'T_type', label: '入库类型' , name: 'T_type' },
   { prop: 'T_submit_name', label: '经办人' },
   { prop: 'T_depot_name', label: '入库仓库' },
   { prop: 'T_date', label: '入库日期' },
@@ -42,8 +43,8 @@ const previewEdit = (row: any) => {
     // console.log('编辑',row,InStorageRef.value)
   InStorageRef.value?.openDrawer()
   InStorageRef.value?.getStorehouseContractGet(row.T_number)
-  for (let key in InStorageRef.value?.form) {  
-    if (row.hasOwnProperty(key)) InStorageRef.value.form[key] = row[key]; 
+  for (let key in InStorageRef.value?.form) {
+    if (row.hasOwnProperty(key)) InStorageRef.value.form[key] = row[key];
   }
 //   console.log('111',InStorageRef.value?.form)
 
@@ -127,6 +128,10 @@ const { options } = depotHooks()
           </el-row>
         </div>
       </template>
+		<template #T_type="{ row }">
+			<el-tag v-if="row.T_type === 1" type="success"> 入库 </el-tag>
+			<el-tag v-else> 退库 </el-tag>
+		</template>
       <template #right="{ row }">
         <el-button link type="success" size="small" :icon="View" @click="preview(row.T_number)">详情</el-button>
         <el-button link type="success" size="small" :icon="Edit" @click="previewEdit(row)">编辑</el-button>

+ 1 - 0
src/views/storehouse/inventory/InStorageEdit.vue

@@ -23,6 +23,7 @@ const drawerProductRef = ref<InstanceType<typeof InStorageProduct> | null>(null)
 const form = reactive<InStoreageFormType>({
   T_number: '',
   T_depot_id: '',
+  T_type: '',
   T_product: '',
   T_date: '',
   T_remark: ''

+ 14 - 1
src/views/storehouse/inventory/InStorageForm.vue

@@ -19,9 +19,14 @@ const drawerRef = ref<InstanceType<typeof Drawer> | null>(null)
 const drawerSnRef = ref<InstanceType<typeof InStorageSn> | null>(null)
 const drawerProductRef = ref<InstanceType<typeof InStorageProduct> | null>(null)
 
+const data: any = reactive({
+	optionsType: [{id:1,T_name:'入库'},{id:2,T_name:'退库'}]
+})
+
 const form = reactive<InStoreageFormType>({
   T_number: '',
   T_depot_id: '',
+  T_type: '',
   T_product: '',
   T_date: '',
   T_remark: ''
@@ -40,7 +45,8 @@ const validate_T_product = (rule: any, value: any, callback: any) => {
 const rules = reactive<FormRules>({
   T_product: [{ validator: validate_T_product, trigger: 'blur' }],
   T_depot_id: [{ required: true, message: '请选择仓库', trigger: 'blur' }],
-  T_date: [{ required: true, message: '请选择入库日期', trigger: 'blur' }]
+  T_date: [{ required: true, message: '请选择入库日期', trigger: 'blur' }],
+  T_type: [{ required: true, message: '请选择入库类型', trigger: 'blur' }]
 })
 
 const columns = [
@@ -226,6 +232,13 @@ defineExpose({
             <el-option v-for="item in props.options" :key="item.Id" :label="item.T_name" :value="item.Id" />
           </el-select>
         </el-form-item>
+
+        <el-form-item label="入库类型:" :label-width="formLabelWidth" prop="T_type">
+          <el-select v-model="form.T_type" class="w-50" clearable placeholder="请选择入库类型~">
+            <el-option v-for="item in data.optionsType" :key="item.id" :label="item.T_name" :value="item.id" />
+          </el-select>
+        </el-form-item>
+
         <el-form-item label="入库日期:" :label-width="formLabelWidth" prop="T_date">
           <el-date-picker
             class="my-date-picker"

+ 8 - 1
src/views/storehouse/inventory/inStorageDetails.vue

@@ -18,8 +18,10 @@ const columns: ColumnProps[] = [
     { prop: 'T_submit_name', label: '经办人' },
     { prop: 'T_date', label: '入库日期' },
     { prop: 'T_depot_name', label: '入库仓库' },
+	{ prop: 'T_type', label: '入库类型', name: 'T_type' },
 
-    { prop: 'T_product_name', label: '产品名称' },
+
+	{ prop: 'T_product_name', label: '产品名称' },
     { prop: 'T_product_model', label: '产品型号' },
     { prop: 'T_num', label: '数量' },
 
@@ -112,6 +114,11 @@ const { options } = depotHooks()
                     
                 </div>
             </template>
+			<template #T_type="{ row }">
+				<el-text class="mx-1" :type="row.T_type==1?'success':'primary'">
+					{{row.T_type==1?'入库':'退库'}}
+				</el-text>
+			</template>
             <template #T_product_relation_sn="{ row }">
                 <el-text class="mx-1" :type="row.T_product_relation_sn==1?'primary':'danger'">
                     {{row.T_product_relation_sn==1?'是':'否'}}