瀏覽代碼

add:采购管理

zoie 1 月之前
父節點
當前提交
782d8af994

+ 17 - 0
src/api/purchase/index.ts

@@ -0,0 +1,17 @@
+import $http from '../index'
+
+// 项目列表
+export const Purchase_List = (params: any) => $http.post('/storage/Purchase/List', params)
+// 审批
+export const Purchase_Approval = (params: any) => $http.post('/storage/Purchase/Approval', params)
+// 我的项目
+export const Purchase_User_list = (params: any) => $http.post('/storage/Purchase/User_list', params)
+// 详情
+export const Purchase_Get = (params: any) => $http.post('/storage/Purchase/Get', params)
+// 立项申请
+export const Purchase_Add = (params: any) => $http.post('/storage/Purchase/Add', params)
+// 编辑
+export const Purchase_Edit = (params: any) => $http.post('/storage/Purchase/Edit', params)
+// 删除
+export const Purchase_Del = (params: any) => $http.post('/storage/Purchase/Del', params)
+

+ 1 - 1
src/views/project/MyProject.vue

@@ -10,7 +10,7 @@ import { Project_Del, Project_Project_User_list } from '@/api/project/index'
 const TableRef = ref<InstanceType<typeof TableBase> | null>(null)
 const projctFormRef = ref<InstanceType<typeof ProjectForm> | null>(null)
 const { globalStore, updateOnTableList } = useTablePublic()
-const ProjectForm = defineAsyncComponent(() => import(/*webpackChunkName: 'ProjectForm'*/ './ProjectForm.vue'))
+const ProjectForm = defineAsyncComponent(() => import(/*webpackChunkName: 'PurchaseForm'*/ './ProjectForm.vue'))
 
 const columns: ColumnProps[] = [
   { type: 'index', label: '序号', width: 80 },

+ 168 - 0
src/views/purchase/MyPurchase.vue

@@ -0,0 +1,168 @@
+<script setup lang="ts">
+import {defineAsyncComponent, nextTick, reactive, ref} from 'vue'
+import {ElMessage, ElMessageBox} from 'element-plus'
+import TableBase from '@/components/TableBase/index.vue'
+import {useTablePublic} from '@/hooks/useTablePublic'
+import {Delete, Edit, View} from '@element-plus/icons-vue'
+import {ColumnProps} from '@/components/TableBase/interface/index'
+import {Purchase_Del, Purchase_User_list} from '@/api/purchase/index'
+
+const TableRef = ref<InstanceType<typeof TableBase> | null>(null)
+const {globalStore, updateOnTableList} = useTablePublic()
+const purchaseFormRef = ref<InstanceType<typeof PurchaseForm> | null>(null)
+const PurchaseForm = defineAsyncComponent(() => import(/*webpackChunkName: 'PurchaseForm'*/ './PurchaseForm.vue'))
+
+const columns: ColumnProps[] = [
+	{type: 'index', label: '序号', width: 80},
+	{prop: 'T_date', label: '申请时间'},
+	{prop: 'T_uuid_name', label: '申请人'},
+	{prop: 'T_State', label: '状态', name: 'T_State'},
+	{prop: 'T_submit_name', label: '提交人'},
+	{prop: 'T_remark', label: '备注', width: 125},
+	{prop: 'operation', label: '操作', width: 200, fixed: 'right'}
+]
+// 搜索
+const options = reactive([
+	{name: '待采购', id: 1},
+	{name: '已采购', id: 2},
+])
+const initParam = reactive({
+	User_tokey: globalStore.GET_User_tokey,
+	T_state: '',
+	T_end_date: '',
+	T_start_date: ''
+})
+
+
+const T_date = ref<string[]>([])
+const searchHandle = () => {
+	initParam.T_end_date = T_date.value ? T_date.value[1] : ''
+	initParam.T_start_date = T_date.value ? T_date.value[0] : ''
+	TableRef.value?.searchTable()
+}
+const DeletePurchase = (Id: number) => {
+	ElMessageBox.confirm('您确定要删除采购申请吗?', '警告', {
+		confirmButtonText: '确定',
+		cancelButtonText: '取消',
+		type: 'warning'
+	})
+		.then(async () => {
+			const res: any = await Purchase_Del({User_tokey: globalStore.GET_User_tokey, T_id: Id})
+			if (res.Code === 200) {
+				ElMessage.success('删除成功!')
+				nextTick(() => updateOnTableList(TableRef.value))
+			}
+		})
+		.catch(() => {
+			ElMessage.warning('取消成功!')
+		})
+}
+const openPurchaseDrawer = (type: string, row?: any) => purchaseFormRef.value?.purchaseFromOpen(type, row)
+</script>
+<template>
+	<div class="my-purchase">
+		<TableBase
+			ref="TableRef"
+			:columns="columns"
+			:requestApi="Purchase_User_list"
+			:initParam="initParam"
+		>
+			<template #table-header>
+				<div class="input-suffix">
+					<el-row :gutter="20" style="margin-bottom: 0">
+						<el-col :xl="6" :lg="6" :md="5" style="display: flex">
+							<span class="inline-flex items-center">申请日期:</span>
+							<el-date-picker
+								v-model="T_date"
+								type="daterange"
+								range-separator="~"
+								start-placeholder="开始时间"
+								end-placeholder="结束时间"
+								format="YYYY-MM-DD"
+								value-format="YYYY-MM-DD"
+							/>
+						</el-col>
+						<el-col :xl="10" :md="12">
+							<span class="inline-flex items-center">状态:</span>
+							<el-select v-model="initParam.T_state" class="w-50 m-2" clearable placeholder="请选择状态~">
+								<el-option v-for="item in options" :key="item.id" :label="item.name" :value="item.id"/>
+							</el-select>
+							<el-button type="primary" @click="searchHandle">搜索</el-button>
+						</el-col>
+						<el-col :xl="8" :md="4">
+							<el-button type="primary" @click="openPurchaseDrawer('new')">采购申请</el-button>
+						</el-col>
+					</el-row>
+				</div>
+			</template>
+
+			<template #T_State="{ row }">
+				<el-tag v-if="row.T_State === 1" effect="dark">待采购</el-tag>
+				<el-tag v-else type="success" effect="dark">已采购</el-tag>
+			</template>
+			<template #right="{ row }">
+				<el-button link type="success" size="small" :icon="View" @click="openPurchaseDrawer('view', row)"
+				>详情
+				</el-button>
+				<el-button
+					link
+					type="primary"
+					size="small"
+					:icon="Edit"
+					:disabled="[2].includes(row.T_State)"
+					@click="openPurchaseDrawer('edit', row)"
+				>编辑
+				</el-button
+				>
+				<el-button
+					link
+					type="danger"
+					size="small"
+					:icon="Delete"
+					:disabled="[2].includes(row.T_State)"
+					@click="DeletePurchase(row.Id)"
+				>删除
+				</el-button
+				>
+			</template>
+		</TableBase>
+		<PurchaseForm ref="purchaseFormRef" purchaseName="myPurchase" @onTableList="updateOnTableList(TableRef)"/>
+	</div>
+</template>
+
+<style scoped lang="scss">
+@import '@/styles/var.scss';
+
+.my-purchase {
+	height: 100%;
+	display: flex;
+	overflow: hidden;
+	@include f-direction;
+
+	:deep(.table-header),
+	:deep(.card) {
+		margin: 0;
+		border-radius: 8px;
+	}
+
+	:deep(.el-table .cell) {
+		white-space: normal !important;
+	}
+	.input-suffix {
+		width: 100%;
+
+		.inline-flex {
+			white-space: nowrap;
+		}
+
+		.btn {
+			display: flex;
+			justify-content: end;
+		}
+
+		.w-50 {
+			width: 12.5rem;
+		}
+	}
+}
+</style>

+ 173 - 0
src/views/purchase/Purchase.vue

@@ -0,0 +1,173 @@
+<script setup lang="ts">
+import {defineAsyncComponent, nextTick, reactive, ref} from 'vue'
+import {ElMessage, ElMessageBox} from 'element-plus'
+import {Delete, Edit, View} from '@element-plus/icons-vue'
+import TableBase from '@/components/TableBase/index.vue'
+import {useTablePublic} from '@/hooks/useTablePublic'
+import {ColumnProps} from '@/components/TableBase/interface/index'
+import {Purchase_Approval, Purchase_Del, Purchase_List} from '@/api/purchase/index'
+
+interface UserInfoIn {
+	T_name: string
+	T_type_name: string
+	T_text: string
+	T_uuid: string
+	T_dept_name: string
+	T_post_name: string
+}
+
+const columns: ColumnProps[] = [
+	{type: 'index', label: '序号', width: 80},
+	{prop: 'T_date', label: '申请时间'},
+	{prop: 'T_uuid_name', label: '申请人'},
+	{prop: 'T_State', label: '状态', name: 'T_State'},
+	{prop: 'T_submit_name', label: '提交人'},
+	{prop: 'T_remark', label: '备注', width: 125},
+	{prop: 'operation', label: '操作', width: 200, fixed: 'right'}
+]
+// 搜索
+const options = reactive([
+	{name: '待采购', id: 1},
+	{name: '已采购', id: 2},
+])
+
+const TableRef = ref<InstanceType<typeof TableBase> | null>(null)
+
+const {globalStore, updateOnTableList} = useTablePublic()
+const openPurchaseDrawer = (type: string, row?: any) => purchaseFormRef.value?.purchaseFromOpen(type, row)
+const purchaseFormRef = ref<InstanceType<typeof PurchaseForm> | null>(null)
+const PurchaseForm = defineAsyncComponent(() => import(/*webpackChunkName: 'PurchaseForm'*/ './PurchaseForm.vue'))
+
+const T_date = ref<string[]>([])
+const initParam = reactive({
+	User_tokey: globalStore.GET_User_tokey,
+	T_state: '',
+	T_end_date: '',
+	T_start_date: ''
+})
+
+const searchHandle = () => {
+	initParam.T_end_date = T_date.value ? T_date.value[1] : ''
+	initParam.T_start_date = T_date.value ? T_date.value[0] : ''
+	TableRef.value?.searchTable()
+}
+const DeletePurchase = (Id: number) => {
+	ElMessageBox.confirm('您确定要删除采购申请吗?', '警告', {
+		confirmButtonText: '确定',
+		cancelButtonText: '取消',
+		type: 'warning'
+	})
+		.then(async () => {
+			const res: any = await Purchase_Del({User_tokey: globalStore.GET_User_tokey, T_id: Id})
+			if (res.Code === 200) {
+				ElMessage.success('删除成功!')
+				nextTick(() => updateOnTableList(TableRef.value))
+			}
+		})
+		.catch(() => {
+			ElMessage.warning('取消成功!')
+		})
+}
+</script>
+<template>
+	<div class="purchase">
+		<TableBase
+			ref="TableRef"
+			:columns="columns"
+			:requestApi="Purchase_List"
+			:initParam="initParam"
+		>
+			<template #table-header>
+				<div class="input-suffix">
+					<el-row :gutter="20" style="margin-bottom: 0">
+						<el-col :xl="6" :lg="6" :md="5" style="display: flex">
+							<span class="inline-flex items-center">申请日期:</span>
+							<el-date-picker
+								v-model="T_date"
+								type="daterange"
+								range-separator="~"
+								start-placeholder="开始时间"
+								end-placeholder="结束时间"
+								format="YYYY-MM-DD"
+								value-format="YYYY-MM-DD"
+							/>
+						</el-col>
+						<el-col :xl="10" :md="12">
+							<span class="inline-flex items-center">状态:</span>
+							<el-select v-model="initParam.T_state" class="w-50 m-2" clearable placeholder="请选择状态~">
+								<el-option v-for="item in options" :key="item.id" :label="item.name" :value="item.id"/>
+							</el-select>
+							<el-button type="primary" @click="searchHandle">搜索</el-button>
+						</el-col>
+					</el-row>
+				</div>
+			</template>
+			<template #T_State="{ row }">
+				<el-tag v-if="row.T_State === 1" effect="dark">待采购</el-tag>
+				<el-tag v-else type="success" effect="dark">已采购</el-tag>
+			</template>
+			<template #right="{ row }">
+				<el-button link type="success" size="small" :icon="View" @click="openPurchaseDrawer('view', row)">详情
+				</el-button>
+				<el-button
+					link
+					type="primary"
+					size="small"
+					:icon="Edit"
+					@click="openPurchaseDrawer('edit', row)"
+				>编辑
+				</el-button
+				>
+				<el-button
+					link
+					type="danger"
+					size="small"
+					:icon="Delete"
+					:disabled="[2].includes(row.T_State)"
+					@click="DeletePurchase(row.Id)"
+				>删除
+				</el-button
+				>
+			</template>
+		</TableBase>
+		<PurchaseForm ref="purchaseFormRef" purchaseName="purchase" @onTableList="updateOnTableList(TableRef)"/>
+	</div>
+</template>
+
+<style scoped lang="scss">
+@import '@/styles/var.scss';
+
+.purchase {
+	height: 100%;
+	display: flex;
+	overflow: hidden;
+	@include f-direction;
+
+	:deep(.table-header),
+	:deep(.card) {
+		margin: 0;
+		border-radius: 8px;
+	}
+
+	:deep(.el-table .cell) {
+		white-space: normal !important;
+	}
+
+	.input-suffix {
+		width: 100%;
+
+		.inline-flex {
+			white-space: nowrap;
+		}
+
+		.btn {
+			display: flex;
+			justify-content: end;
+		}
+
+		.w-50 {
+			width: 12.5rem;
+		}
+	}
+}
+</style>

+ 216 - 0
src/views/purchase/PurchaseDetail.vue

@@ -0,0 +1,216 @@
+<script setup lang="ts">
+import { ref, reactive, nextTick, computed } from 'vue'
+import Drawer from '@/components/Drawer/index.vue'
+import type { FormInstance, FormRules } from 'element-plus'
+import { ColumnProps } from '@/components/TableBase/interface/index'
+import { generateRandom } from '@/utils/common'
+
+const isNew = ref(true)
+const tableData = ref<any[]>([])
+const formLabelWidth = ref('140px')
+const ruleFormRef = ref<FormInstance>()
+const drawerRef = ref<InstanceType<typeof Drawer> | null>(null)
+
+const form = ref({
+  	id: '',
+	T_name:'',
+	T_model:'',
+	T_spec:'',
+	T_quantity:'',
+	T_demand:'',
+	T_remark:'',
+	T_state:1,
+	T_date:'',
+	T_unit_price:'',
+	T_amount:'',
+	T_reference_site:'',
+})
+const rules = reactive<FormRules>({
+	T_name: [{ required: true, message: '请输入名称', trigger: 'blur' }],
+	T_quantity: [{ required: true, message: '数量', trigger: 'blur' }]
+})
+const columns: ColumnProps[] = [
+  { type: 'index', label: '序号', width: 80, align: 'center' },
+  { prop: 'T_name', label: '名称', align: 'center' },
+  { prop: 'T_model', label: '型号', align: 'center', width: 100 },
+  { prop: 'T_spec', label: '规格', align: 'center', width: 100 },
+  { prop: 'T_quantity', label: '数量', align: 'center'},
+  { prop: 'T_reference_site', label: '参考网址', align: 'center', width: 140 },
+  { prop: 'T_demand', label: '需求', align: 'center', width: 140 },
+  { prop: 'T_remark', label: '备注', align: 'center', width: 140 },
+  { prop: 'T_state', label: '状态', align: 'center', width: 80 },
+  { prop: 'T_date', label: '采购时间', align: 'center', width: 120 },
+  { prop: 'T_unit_price', label: '采购单价', align: 'center', width: 100},
+  { prop: 'T_amount', label: '采购金额', align: 'center', width: 100},
+  { prop: 'operation', label: '操作', width: 160, fixed: 'right', align: 'center' }
+]
+
+const openProductionDetailed = (type: string, row?: any) => {
+  isNew.value = type === 'new' ? true : false
+  if (!isNew.value) {
+    form.value = { ...row }
+  }
+  drawerRef.value?.openDrawer()
+}
+const callbackDrawer = (done: () => void) => {
+  done()
+  resetForm(ruleFormRef.value)
+}
+const resetForm = (formEl: FormInstance | undefined) => {
+  if (!formEl) return
+  formEl.resetFields()
+}
+const deletePurchaseDetail = (id: string) => {
+  tableData.value = tableData.value.filter((item: any) => item.id !== id)
+  emit('onPlanning', tableData.value)
+}
+const addPurchaseDetail = (formEl: FormInstance | undefined) => {
+  if (!formEl) return
+  formEl.validate(valid => {
+    if (valid) {
+      if (isNew.value) {
+        tableData.value.push({ ...form.value, id: generateRandom() })
+      } else {
+        const index = tableData.value.findIndex(item => item.id === form.value.id)
+        tableData.value[index] = { ...form.value }
+      }
+
+      nextTick(() => {
+        isNew.value = true
+        drawerRef.value?.closeDrawer()
+        resetForm(ruleFormRef.value)
+		emit('onPlanning', tableData.value)
+      })
+    }
+  })
+}
+const emit = defineEmits<{ (event: 'onPlanning', value: any): void }>()
+const getDetailInfo = () => tableData.value
+const clearDetail = () => (tableData.value = [])
+const setDetailData = (info: any[]) => {
+  tableData.value = info.map((item: any) => {
+    item.id = generateRandom()
+    return item
+  })
+}
+defineExpose({
+  getDetailInfo,
+  clearDetail,
+  setDetailData
+})
+const props = defineProps<{ disabled: boolean; isShow?: string;typeTip?:string }>()
+const disabled = computed(() => props.disabled)
+const isShow = ref(props.isShow)
+const typeTip = ref(props.typeTip)
+</script>
+
+<template>
+  <el-table
+    stripe
+    :data="tableData"
+    style="width: 100%"
+    :header-cell-style="{
+      background: 'rgb(225 226 228)',
+      color: '#000'
+    }"
+  >
+    <template v-for="item in columns" :key="item.prop">
+
+		<el-table-column
+			v-if="item.prop === 'T_state'"
+			:label="item.label"
+			:width="item.width"
+			align="center"
+		>
+			<template v-slot="scope">
+				<el-text v-if="scope.row.T_state === 1" effect="dark">待采购</el-text>
+				<el-text v-else type="success" effect="dark">已采购</el-text>
+			</template>
+		</el-table-column>
+      <el-table-column show-overflow-tooltip v-bind="item" v-else-if="item.type === 'index'"></el-table-column>
+      <el-table-column show-overflow-tooltip v-bind="item" v-else-if="item.fixed !== 'right' && item.type !== 'index'"> </el-table-column>
+      <el-table-column show-overflow-tooltip v-bind="item" v-else-if="item.fixed === 'right'">
+        <template #default="{ row }">
+          <el-button size="small" :disabled="typeTip === 'view'" type="primary" @click="openProductionDetailed('edit', row)"
+            >编辑</el-button
+          >
+          <el-button size="small" :disabled="isShow !== 'myPurchase' || typeTip === 'view'" type="danger" @click="deletePurchaseDetail(row.id)"
+            >删除</el-button>
+        </template>
+      </el-table-column>
+    </template>
+    <template #append v-if="isShow === 'myPurchase'">
+      <el-button type="primary" :disabled="disabled" @click="openProductionDetailed('new')">
+        <el-icon><Plus /></el-icon><span style="margin-left: 6px">添加</span>
+      </el-button>
+    </template>
+  </el-table>
+  <Drawer ref="drawerRef" :handleClose="callbackDrawer">
+    <template #header="{ params }">
+      <h4 :id="params.titleId" :class="params.titleClass">{{ isNew ? '添加' : '编辑' }} - 采购明细</h4>
+    </template>
+    <el-form ref="ruleFormRef" :model="form" :rules="rules">
+      <el-form-item label="名称:" :label-width="formLabelWidth" prop="T_name">
+        <el-input v-model="form.T_name" type="text" autocomplete="off" placeholder="请输入名称" />
+      </el-form-item>
+      <el-form-item label="型号:" :label-width="formLabelWidth" prop="T_model">
+        <el-input v-model="form.T_model" type="text" autocomplete="off" placeholder="请输入型号" />
+      </el-form-item>
+      <el-form-item label="规格:" :label-width="formLabelWidth" prop="T_spec">
+        <el-input v-model="form.T_spec" type="text" autocomplete="off" placeholder="请输入规格" />
+      </el-form-item>
+		<el-form-item label="数量:" :label-width="formLabelWidth" prop="T_spec">
+			<el-input v-model="form.T_quantity" type="text" autocomplete="off" placeholder="请输入数量" />
+		</el-form-item>
+		<el-form-item label="参考网址:" :label-width="formLabelWidth" prop="T_reference_site">
+			<el-input v-model="form.T_reference_site" type="text" autocomplete="off" placeholder="请输入参考网址" />
+		</el-form-item>
+		<el-form-item label="需求:" :label-width="formLabelWidth" prop="T_demand">
+			<el-input v-model="form.T_demand" type="text" autocomplete="off" placeholder="请输入需求" />
+		</el-form-item>
+		<el-form-item label="备注:" :label-width="formLabelWidth" prop="T_remark">
+			<el-input v-model="form.T_remark" type="text" autocomplete="off" placeholder="请输入备注" />
+		</el-form-item>
+		<el-form-item v-if="isShow !== 'myPurchase'" label="状态:" :label-width="formLabelWidth" prop="T_state">
+			<el-radio-group v-model="form.T_state">
+				<el-radio :label="1">待采购</el-radio>
+				<el-radio :label="2">已采购</el-radio>
+			</el-radio-group>
+		</el-form-item>
+		<el-form-item v-if="isShow !== 'myPurchase'" label="采购时间:" :label-width="formLabelWidth" prop="T_date">
+			<el-date-picker
+				style="flex: 0 0 50%"
+				class="my-date-picker"
+				v-model="form.T_date"
+				type="date"
+				placeholder="采购时间"
+				format="YYYY-MM-DD"
+				value-format="YYYY-MM-DD"
+			/>
+		</el-form-item>
+		<el-form-item label="采购单价:" :label-width="formLabelWidth" prop="T_unit_price">
+			<el-input v-model="form.T_unit_price" type="text" autocomplete="off" placeholder="请输入采购单价" />
+		</el-form-item>
+		<el-form-item v-if="isShow !== 'myPurchase'" label="采购金额:" :label-width="formLabelWidth" prop="T_amount">
+			<el-input v-model="form.T_amount" type="text" autocomplete="off" placeholder="请输入采购金额" />
+		</el-form-item>
+      <el-form-item :label-width="formLabelWidth">
+        <el-button v-if="isNew" class="btn"  type="primary" @click="addPurchaseDetail(ruleFormRef)"
+          >添加</el-button
+        >
+        <el-button v-else class="btn" type="primary" @click="addPurchaseDetail(ruleFormRef)"
+          >修改</el-button
+        >
+      </el-form-item>
+    </el-form>
+  </Drawer>
+</template>
+
+<style scoped lang="scss">
+:deep(.el-drawer__body .el-table .cell) {
+  white-space: normal !important;
+}
+.el-form-item {
+  margin-bottom: 18px;
+}
+</style>

+ 195 - 0
src/views/purchase/PurchaseForm.vue

@@ -0,0 +1,195 @@
+<script setup lang="ts">
+import { ElMessage } from 'element-plus'
+import { ref, reactive, nextTick } from 'vue'
+import { GlobalStore } from '@/stores/index'
+import PurchaseDetail from './PurchaseDetail.vue'
+import Drawer from '@/components/Drawer/index.vue'
+import type { FormInstance, FormRules } from 'element-plus'
+import { Purchase_Get, Purchase_Edit, Purchase_Add } from '@/api/purchase/index'
+import receiveUser from '@/views/storehouse/outStock/receiveUser.vue'
+
+const typeTip = ref('')
+const formLabelWidth = ref('120px')
+const globalStore = GlobalStore()
+const User_tokey = globalStore.GET_User_tokey
+const ruleFormRef = ref<FormInstance>()
+const drawerRef = ref<InstanceType<typeof Drawer> | null>(null)
+const purchaseDetailRef = ref<InstanceType<typeof PurchaseDetail> | null>(null)
+const userDrawerRef = ref<InstanceType<typeof receiveUser> | null>(null)
+const form = ref({
+  Id: '',
+  T_date: '',
+  T_uuid: '',
+  T_uuid_name: '',
+  T_detail: '',
+  T_remark: '',
+  T_State: '',
+  T_approver: '',
+  T_approver_name: '',
+
+})
+const rules = reactive<FormRules>({
+  T_name: [{ required: true, message: '请输入采购申请名称', trigger: 'blur' }]
+})
+const resetForm = (formEl: FormInstance | undefined) => {
+  if (!formEl) return
+  formEl.resetFields()
+}
+const callbackDrawer = (done: () => void) => {
+  resetForm(ruleFormRef.value)
+  purchaseDetailRef.value?.clearDetail()
+  done()
+}
+const addPurchase = (formEl: FormInstance | undefined) => {
+  if (!formEl) return
+  formEl.validate(async valid => {
+    if (valid) {
+      let res: any = ''
+      let detail = ''
+      purchaseDetailRef.value?.getDetailInfo().forEach((item: any) => {
+        detail += `${item.T_name},${item.T_model},${item.T_spec},${item.T_quantity},${item.T_demand},${item.T_remark},${item.T_state},${item.T_date},${item.T_unit_price},${item.T_amount},${item.T_reference_site}|`
+      })
+      const params = {
+        User_tokey,
+        ...form.value,
+        T_detail: detail,
+        T_approver: form.value.T_uuid
+      }
+      if (typeTip.value === 'new') {
+        res = await Purchase_Add(params)
+      } else {
+        res = await Purchase_Edit({ ...params, T_id: form.value.Id })
+      }
+
+      if (res.Code === 200) {
+        ElMessage.success(`采购申请${typeTip.value === 'new' ? '添加' : '修改'}成功!`)
+        nextTick(() => {
+          emit('onTableList')
+          drawerRef.value?.closeDrawer()
+          resetForm(ruleFormRef.value)
+        })
+      }
+    }
+  })
+}
+
+const getPurchaseInfo = ({ T_uuid, T_name }: { T_uuid: string; T_name: string }) => {
+	form.value.T_uuid_name = T_name
+	form.value.T_uuid = T_uuid
+}
+const selectUser = () => userDrawerRef.value?.openDrawer()
+
+const purchaseFromOpen = (type: string, row?: any) => {
+  typeTip.value = type
+  nextTick(async () => {
+    if (typeTip.value !== 'new') {
+      form.value = { ...row }
+      form.value.T_approver = row.T_approver_name
+      form.value.T_uuid = row.T_approver
+      const res: any = await Purchase_Get({ T_id: row.Id })
+      if (res.Code === 200) {
+        purchaseDetailRef.value?.setDetailData(res.Data.T_Detail)
+      }
+    }
+  })
+  drawerRef.value?.openDrawer()
+}
+
+const props = defineProps<{ purchaseName: string }>()
+const purchaseName = ref(props.purchaseName)
+
+const getTitle = (type: string) => {
+  switch (type) {
+    case 'new':
+      return '新增'
+    case 'edit':
+      return '编辑'
+    default:
+      return '详情'
+  }
+}
+
+const emit = defineEmits<{ (event: 'onTableList'): void }>()
+
+defineExpose({
+  purchaseFromOpen
+})
+</script>
+<template>
+  <Drawer ref="drawerRef" :handleClose="callbackDrawer" size="90%">
+    <template #header="{ params }">
+      <h4 :id="params.titleId" :class="params.titleClass">采购申请 - {{ getTitle(typeTip) }}</h4>
+    </template>
+    <el-form ref="ruleFormRef" :model="form" :rules="rules">
+
+      <el-form-item label="申请日期:" :label-width="formLabelWidth" prop="T_date">
+        <el-date-picker
+          style="flex: 0 0 50%"
+          class="my-date-picker"
+          v-model="form.T_date"
+		  :disabled="purchaseName !=='myPurchase'"
+          type="date"
+          placeholder="申请日期"
+          format="YYYY-MM-DD"
+          value-format="YYYY-MM-DD"
+        />
+      </el-form-item>
+      <el-form-item  label="申请人:" :label-width="formLabelWidth" prop="T_uuid">
+			<el-input
+				v-model="form.T_uuid_name"
+				:disabled="purchaseName !=='myPurchase'"
+				placeholder="请选择申请人"
+				class="w-50"
+				@focus="selectUser"
+			/>
+		</el-form-item>
+
+      <el-form-item label="采购明细:" :label-width="formLabelWidth" prop="T_detail">
+        <PurchaseDetail
+          ref="purchaseDetailRef"
+          :disabled="! (typeTip === 'new' || typeTip === 'edit')"
+          :isShow="purchaseName"
+          :typeTip="typeTip"
+        ></PurchaseDetail>
+      </el-form-item>
+	<el-form-item v-if="purchaseName !== 'myPurchase'"  label="状态:" :label-width="formLabelWidth" prop="T_state">
+		<el-radio-group v-model="form.T_State" :disabled="! (typeTip === 'new' || typeTip === 'edit')">
+			<el-radio :label="1">待采购</el-radio>
+			<el-radio :label="2">已采购</el-radio>
+		</el-radio-group>
+	</el-form-item>
+      <!-- my purchase -->
+      <el-form-item label="备注:" :label-width="formLabelWidth" prop="T_remark">
+        <el-input
+          v-model="form.T_remark"
+          :disabled="! (typeTip === 'new' || typeTip === 'edit')"
+          :autosize="{ minRows: 4, maxRows: 6 }"
+          type="textarea"
+          placeholder="请输入备注信息"
+        />
+      </el-form-item>
+
+      <el-form-item :label-width="formLabelWidth" v-if="purchaseName === 'purchase' || purchaseName === 'myPurchase'">
+        <el-button v-if="typeTip === 'new'" class="btn" color="#626aef" @click="addPurchase(ruleFormRef)"
+          >提交</el-button
+        >
+        <el-button v-if="typeTip === 'edit'" class="btn" color="#626aef" @click="addPurchase(ruleFormRef)"
+          >修改</el-button
+        >
+      </el-form-item>
+    </el-form>
+	  <receiveUser
+		  ref="userDrawerRef"
+		  @onUserInfo="getPurchaseInfo"
+		  title="选择申请人"
+	  ></receiveUser>
+  </Drawer>
+</template>
+<style scoped lang="scss">
+.btn {
+  padding: 0 25px;
+}
+.w-50 {
+  flex: 0 0 50%;
+}
+</style>

+ 1 - 1
src/views/storehouse/RepairWorkOrder/MyRepairWorkOrder.vue

@@ -132,7 +132,7 @@ const openRepairWorkOrderFormDrawer = (type: string, row?: any) => repairWorkOrd
 						</el-col>
 						<el-col :xl="10" :md="12">
 							<span class="inline-flex items-center">状态:</span>
-							<el-select v-model="initParam.T_state" class="w-50 m-2" clearable placeholder="请选择分类~">
+							<el-select v-model="initParam.T_state" class="w-50 m-2" clearable placeholder="请选择状态~">
 								<el-option v-for="item in options" :key="item.id" :label="item.name" :value="item.id"/>
 							</el-select>
 							<el-button type="primary" @click="searchOnTableList(TableRef)">搜索</el-button>

+ 1 - 1
src/views/storehouse/RepairWorkOrder/RepairWorkOrder.vue

@@ -116,7 +116,7 @@ const openRepairWorkOrderFormDrawer = (type: string, row?: any) => repairWorkOrd
             </el-col>
             <el-col :xl="10" :md="12">
               <span class="inline-flex items-center">状态:</span>
-              <el-select v-model="initParam.T_state" class="w-50 m-2" clearable placeholder="请选择分类~">
+              <el-select v-model="initParam.T_state" class="w-50 m-2" clearable placeholder="请选择状态~">
                 <el-option v-for="item in options" :key="item.id" :label="item.name" :value="item.id" />
               </el-select>
               <el-button type="primary" @click="searchOnTableList(TableRef)">搜索</el-button>

+ 13 - 0
src/views/storehouse/ValidationTool/modules/snAdd.vue

@@ -1,5 +1,6 @@
 <script setup lang="ts">
 import {
+	readValidation,
 	validation_add,
 	validation_repair,
 	validation_scrap,
@@ -117,6 +118,18 @@ const submitForm = () => {
 				ElMessage.warning('已存在相同的SN,不能添加')
 				return
 			}
+			if (data.title == '归还' ) {
+				const result: any = await readValidation({sn: extractedSN})
+				if (result.Code !== 200) {
+					ElMessage.warning('查询SN失败!')
+					return
+				}
+				if (result.Data.T_state == 2) {
+					ElMessage.error('当前SN已入库!')
+					return
+				}
+			}
+
 			data.snItems.unshift({...data.fromData, T_sn: extractedSN})
 			data.fromData.T_sn = ''
 			ElMessage.success('已添加到待提交列表')

+ 3 - 1
src/views/storehouse/ValidationTool/validation.vue

@@ -254,7 +254,8 @@ const paginatedPendingLendItems = computed(() => {
 })
 
 const lendRules = reactive({
-	T_sn: [{required: true, message: '请输入SN', trigger: 'blur'}]
+	T_sn: [{required: true, message: '请输入SN', trigger: 'blur'}],
+	LendUser: [{required: true, message: '请输入借出人', trigger: 'blur'}]
 })
 
 const submitLendForm = () => {
@@ -296,6 +297,7 @@ const submitLendForm = () => {
 	})
 }
 
+
 const removePendingLendItem = (index: number) => {
 	pendingLendItems.value.splice(index, 1)
 	ElMessage.success('已从待提交列表中移除')

+ 3 - 2
src/views/storehouse/inventory/Device.vue

@@ -21,11 +21,12 @@ const columns: ColumnProps[] = [
   { prop: 'T_product_class_name', label: '产品分类' },
   { prop: 'T_product_model', label: '产品型号', ellipsis: true },
   { prop: 'T_product_spec', label: '产品规格' },
-  { prop: 'T_sn', label: '设备SN', ellipsis: true },
+  { prop: 'T_sn', label: '设备SN', width: 180 },
   { prop: 'T_imei', label: '模组imei', ellipsis: true },
   { prop: 'T_iccid', label: '物联网卡号', ellipsis: true },
+  { prop: 'T_device_number', label: '设备编号', width: 160  },
   { prop: 'T_State', label: '状态', name: 'T_State' },
-  { prop: 'operation', label: '操作', width: 260, fixed: 'right' }
+  { prop: 'operation', label: '操作', width: 160, fixed: 'right' }
 ]
 
 // 搜索

+ 1 - 13
src/views/storehouse/inventory/IOTNetworkCard.vue

@@ -64,7 +64,7 @@ const editStateRules = reactive<FormRules>({
 	T_receive_name: [{required: true, message: '请选择领用人', trigger: 'blur'}],
 })
 const form: any = ref({
-	T_id: "",
+	T_id: '',
 	T_company_name: '',
 	T_in_date: '',
 	T_meal_type: '',
@@ -101,18 +101,6 @@ const options = reactive([
 const openDrawer = (type: string, row?: any) => {
 	isNew.value = type === 'new' ? true : false
 	if (type == 'edit') {
-		// form.value.T_id = row.Id
-		// form.value.T_in_date = row.T_in_date
-		// form.value.T_meal_type = row.T_meal_type
-		// form.value.T_meal = row.T_meal
-		// form.value.T_expire = row.T_expire
-		// form.value.T_iccid = row.T_iccid
-		// form.value.T_MSISDN = row.T_MSISDN
-		// form.value.T_out_date = row.T_out_date
-		// form.value.T_out_project = row.T_out_project
-		// form.value.T_receive = row.T_receive
-		// form.value.T_receive_name = row.T_receive_name
-		// form.value.T_State = row.T_State
 		for (let key in form.value) {
 			if (row.hasOwnProperty(key)) {
 				form.value[key] = row[key];

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

@@ -165,6 +165,7 @@ defineExpose({
           <el-button type="success" @click="drawer = true">导入xlsx</el-button>
         </div>
       </template>
+	  <div>数量:{{ tableSnData.length }}</div>
       <el-table
         ref="snTable"
         :data="tableSnData"

+ 8 - 6
src/views/storehouse/outStock/modules/InStorageEdit.vue

@@ -11,6 +11,7 @@ import { Delete, CirclePlus } from '@element-plus/icons-vue'
 import { Storehouse_StockOut_EditGet,Storehouse_StockOut_Get } from '@/api/storehouse/index'
 import ImageCom from '@/components/Image/index.vue'
 import ReceiveUser from '../receiveUser.vue'
+import OutStockProduct from "@/views/storehouse/outStock/OutStockProduct.vue";
 
 const tableData = ref<any[]>([])
 const globalStore = GlobalStore()
@@ -384,15 +385,16 @@ defineExpose({
           </el-divider>
         </div>
         <InStorageEditSn ref="drawerSnEditRef" @onCount="autoGetCount" />
-        <InStorageProduct
-          ref="drawerProductRef"
-          @ontableData="ProductselectionChange"
-          @ontableDataAll="ProductSelectionAllChange"
-        />
+
       </el-form>
     </Drawer>
     <ReceiveUser ref="receiveUserdialog" :dept_leader="0" @onUserInfo="getReceiveInfo" title="选择经办人" />
-
+	  <OutStockProduct
+		  ref="drawerProductRef"
+		  :depotId="form.T_depot_id"
+		  @ontableData="ProductselectionChange"
+		  @ontableDataAll="ProductSelectionAllChange"
+	  />
   </div>
 </template>
 <style scoped lang="scss">

+ 1 - 1
src/views/storehouse/sales/MyPercentage.vue

@@ -128,7 +128,7 @@ const processdel = (id: any) => {
 							<span class="inline-flex items-center">关键字:</span>
 							<el-input v-model="initParam.T_name" type="text" class="w-50 m-2"
 									  placeholder="按任务编号、公司名称搜索" clearable
-									  @change="searchOnTableList(TableRef)"/>
+									  @change="searchHandle"/>
 						</el-col>
 						<el-col :xl="5" :md="6">
 							<span class="inline-flex items-center">状态:</span>

+ 7 - 1
src/views/storehouse/sales/Percentage.vue

@@ -62,6 +62,12 @@ const initParam = reactive({
 const loading = ref(false)
 const centerDialogVisible = ref(false)
 
+const searchHandle = () => {
+	initParam.T_end_date = T_date.value ? T_date.value[1] : ''
+	initParam.T_start_date = T_date.value ? T_date.value[0] : ''
+	TableRef.value?.searchTable()
+}
+
 // 导出
 const exportPercentageExcel = async () => {
 	initParam.T_end_date = T_date.value ? T_date.value[1] : ''
@@ -227,7 +233,7 @@ const batchSubmitApproval = async () => {
               <el-select v-model="initParam.T_state" class="w-50" clearable placeholder="请选择状态~">
                 <el-option v-for="item in options2" :key="item.id" :label="item.name" :value="item.id" />
               </el-select>
-				<el-button type="primary" @click="searchOnTableList(TableRef)">搜索</el-button>
+				<el-button type="primary" @click="searchHandle">搜索</el-button>
 			</el-col>
 
           </el-row>

+ 1 - 1
src/views/storehouse/verifyItem.vue

@@ -167,7 +167,7 @@ const initParam = reactive({
         </el-form-item>
         <el-form-item label="类型:" class="m-b-6" :label-width="formLabelWidth" prop="T_type">
           <el-radio-group v-model="form.T_type" class="ml-4">
-            <el-radio :label="item.id" v-for="item,index in options3">{{item.name}}</el-radio>
+            <el-radio :label="item.id" v-for="item in options3">{{item.name}}</el-radio>
           </el-radio-group>
         </el-form-item>
         <el-form-item label="金额:" class="m-b-6" :label-width="formLabelWidth" prop="T_price">