Browse Source

物资申请调整

Hwf 5 months ago
parent
commit
188bf5136d

+ 8 - 0
src/api/comprehensiveGuarantee/materialReserveManagement/materialInformation.ts

@@ -37,3 +37,11 @@ export function deleteMaterial(id: string) {
     method: 'delete'
   });
 }
+// 仓库-物资树
+export function getMaterialTreeSelectList(params) {
+  return request({
+    url: '/api/resource_provison/material/material/treeselect',
+    method: 'get',
+    params: params
+  });
+}

+ 11 - 0
src/types/components.d.ts

@@ -29,6 +29,7 @@ declare module 'vue' {
     ElButton: typeof import('element-plus/es')['ElButton']
     ElCard: typeof import('element-plus/es')['ElCard']
     ElCheckbox: typeof import('element-plus/es')['ElCheckbox']
+    ElCheckboxGroup: typeof import('element-plus/es')['ElCheckboxGroup']
     ElCol: typeof import('element-plus/es')['ElCol']
     ElColorPicker: typeof import('element-plus/es')['ElColorPicker']
     ElConfigProvider: typeof import('element-plus/es')['ElConfigProvider']
@@ -45,14 +46,20 @@ declare module 'vue' {
     ElIcon: typeof import('element-plus/es')['ElIcon']
     ElImage: typeof import('element-plus/es')['ElImage']
     ElInput: typeof import('element-plus/es')['ElInput']
+    ElInputNumber: typeof import('element-plus/es')['ElInputNumber']
+    ElLink: typeof import('element-plus/es')['ElLink']
     ElMenu: typeof import('element-plus/es')['ElMenu']
     ElMenuItem: typeof import('element-plus/es')['ElMenuItem']
     ElOption: typeof import('element-plus/es')['ElOption']
     ElPagination: typeof import('element-plus/es')['ElPagination']
     ElPopover: typeof import('element-plus/es')['ElPopover']
+    ElRadio: typeof import('element-plus/es')['ElRadio']
+    ElRadioGroup: typeof import('element-plus/es')['ElRadioGroup']
     ElRow: typeof import('element-plus/es')['ElRow']
     ElScrollbar: typeof import('element-plus/es')['ElScrollbar']
     ElSelect: typeof import('element-plus/es')['ElSelect']
+    ElSkeleton: typeof import('element-plus/es')['ElSkeleton']
+    ElSkeletonItem: typeof import('element-plus/es')['ElSkeletonItem']
     ElSlider: typeof import('element-plus/es')['ElSlider']
     ElSubMenu: typeof import('element-plus/es')['ElSubMenu']
     ElSwitch: typeof import('element-plus/es')['ElSwitch']
@@ -66,6 +73,7 @@ declare module 'vue' {
     ElTimelineItem: typeof import('element-plus/es')['ElTimelineItem']
     ElTooltip: typeof import('element-plus/es')['ElTooltip']
     ElTree: typeof import('element-plus/es')['ElTree']
+    ElTreeSelect: typeof import('element-plus/es')['ElTreeSelect']
     ElUpload: typeof import('element-plus/es')['ElUpload']
     ExcelEditor: typeof import('./../components/ExcelEditor/index.vue')['default']
     FileUpload: typeof import('./../components/FileUpload/index.vue')['default']
@@ -77,6 +85,9 @@ declare module 'vue' {
     HikvisionPlayer: typeof import('./../components/HKVideo/hikvision-player.vue')['default']
     HKVideo: typeof import('./../components/HKVideo/index.vue')['default']
     IconSelect: typeof import('./../components/IconSelect/index.vue')['default']
+    IEpCaretBottom: typeof import('~icons/ep/caret-bottom')['default']
+    IEpCaretTop: typeof import('~icons/ep/caret-top')['default']
+    IEpUploadFilled: typeof import('~icons/ep/upload-filled')['default']
     IFrame: typeof import('./../components/iFrame/index.vue')['default']
     ImagePreview: typeof import('./../components/ImagePreview/index.vue')['default']
     ImageUpload: typeof import('./../components/ImageUpload/index.vue')['default']

+ 82 - 0
src/views/comprehensiveGuarantee/materialReserves/materialTreeSelect.vue

@@ -0,0 +1,82 @@
+<template>
+  <div>
+    <el-dialog v-model="dialogVisible" title="选择" width="780px" append-to-body>
+      <el-checkbox-group :model-value="selectedTreeId">
+        <el-tree :data="treeData">
+          <template #default="{ node, data }">
+            <div v-if="data.isWarehouse" class="custom-tree-node">{{ node.label }}</div>
+            <div v-else class="custom-tree-node" @click="handleCheckChange(data)">
+              <el-checkbox :label="node.label" :value="data.id" />
+            </div>
+          </template>
+        </el-tree>
+      </el-checkbox-group>
+      <template #footer>
+        <div class="dialog-footer">
+          <el-button @click="close">取消</el-button>
+          <el-button type="primary" @click="confirm">确定</el-button>
+        </div>
+      </template>
+    </el-dialog>
+  </div>
+</template>
+
+<script setup lang="ts" name="materialTreeSelect">
+import { getMaterialTreeSelectList } from '@/api/comprehensiveGuarantee/materialReserveManagement/materialInformation';
+
+const props = defineProps({
+  modelValue: Boolean
+});
+const emits = defineEmits(['update:modelValue', 'confirm']);
+const dialogVisible = computed({
+  get() {
+    return props.modelValue;
+  },
+  set(newValue) {
+    emits('update:modelValue', newValue);
+  }
+});
+const queryParams = reactive({
+  material_name: '',
+  material_type_name: ''
+});
+let treeData = ref([]);
+let selectedTreeId = ref([]);
+let selectedTreeData = ref({});
+watch(
+  () => props.modelValue,
+  (newValue) => {
+    if (!!newValue) {
+      getMaterialTreeSelectList(queryParams).then((res) => {
+        treeData.value = res.data;
+      });
+    } else {
+      selectedTreeId.value = [];
+      selectedTreeData.value = {};
+    }
+  },
+  {
+    immediate: true
+  }
+);
+
+const handleCheckChange = (data) => {
+  selectedTreeId.value[0] = data.id;
+  selectedTreeData.value = data;
+};
+
+const close = () => {
+  emits('update:modelValue', false);
+};
+
+const confirm = () => {
+  emits('confirm', selectedTreeData.value);
+  close();
+};
+</script>
+
+<style lang="scss" scoped>
+.custom-tree-node {
+  width: 100%;
+}
+</style>

+ 53 - 47
src/views/comprehensiveGuarantee/materialReserves/materialsDeclarationAdd.vue

@@ -17,33 +17,19 @@
                 <span>{{ $index + 1 }}</span>
               </template>
             </el-table-column>
-            <el-table-column label="仓库" prop="material_type" align="center">
+            <el-table-column label="物资名称" prop="material_name" align="center">
               <template #default="scope">
-                <el-form-item :prop="'detail.' + scope.$index + '.warehouse_id'" :rules="rules.warehouse_id" disabled>
-                  <el-select v-model="scope.row.warehouse_id" @change="handleWarehouseChange">
-                    <el-option v-for="item in warehouseList" :key="item.warehouse_id" :label="item.warehouse_name" :value="item.warehouse_id" />
-                  </el-select>
-                </el-form-item>
-              </template>
-            </el-table-column>
-            <el-table-column label="物资类型" prop="material_type" align="center">
-              <template #default="scope">
-                <el-form-item :prop="'detail.' + scope.$index + '.material_type'" :rules="rules.material_type" disabled>
-                  <el-select v-model="scope.row.material_type">
-                    <el-option v-for="(item, index) in material_type" :key="index" :label="item.label" :value="item.value" />
-                  </el-select>
-                </el-form-item>
-              </template>
-            </el-table-column>
-            <el-table-column label="物资名称" prop="material_code" align="center">
-              <template #default="scope">
-                <el-form-item :prop="'detail.' + scope.$index + '.material_type'" :rules="rules.material_type">
-                  <el-select v-model="scope.row.material_code">
-                    <el-option v-for="(item, index) in materialList" :key="index" :label="item.material_name" :value="item.material_id" />
-                  </el-select>
+                <el-form-item :prop="'detail.' + scope.$index + '.material_type'" :rules="rules.material_name">
+                  <el-input v-model="scope.row.material_name" readonly>
+                    <template #append>
+                      <el-button @click="handleShowSelect(scope.$index)">选择</el-button>
+                    </template>
+                  </el-input>
                 </el-form-item>
               </template>
             </el-table-column>
+            <el-table-column label="仓库" prop="warehouse_id" align="center" />
+            <el-table-column label="物资类型" prop="material_type" align="center" />
             <el-table-column label="物资数量(件)" prop="material_quantity" align="center">
               <template #default="scope">
                 <el-form-item :prop="`detail.${scope.$index}.material_quantity`" :rules="rules.material_quantity">
@@ -53,14 +39,14 @@
             </el-table-column>
             <el-table-column label="物资单价(元)" prop="material_unit_price" align="center">
               <template #default="scope">
-                <el-form-item :prop="'detail.' + scope.$index + '.material_type'" :rules="rules.material_type">
+                <el-form-item :prop="'detail.' + scope.$index + '.material_unit_price'" :rules="rules.material_unit_price">
                   <el-input v-model="scope.row.material_unit_price" type="number" placeholder="请输入" @input="calcTotalAmount" />
                 </el-form-item>
               </template>
             </el-table-column>
             <el-table-column label="物资用途" prop="material_purpose" align="center">
               <template #default="scope">
-                <el-form-item :prop="'detail.' + scope.$index + '.material_type'" :rules="rules.material_type">
+                <el-form-item :prop="'detail.' + scope.$index + '.material_purpose'" :rules="rules.material_purpose">
                   <el-input v-model="scope.row.material_purpose" type="textarea" autosize placeholder="请输入" />
                 </el-form-item>
               </template>
@@ -82,17 +68,18 @@
         </div>
       </div>
     </div>
+    <materialTreeSelect v-model="showSelect" @confirm="handleSelectChange" />
   </div>
 </template>
 
 <script setup lang="ts">
-import { getMaterialList } from '@/api/comprehensiveGuarantee/materialReserveManagement/MaterialStatistics';
 import {
   createProcurement,
   getDeclarationDetail,
   updateProcurement
 } from '@/api/comprehensiveGuarantee/materialReserveManagement/materialsDeclaration';
 import BigNumber from 'bignumber.js';
+import materialTreeSelect from './materialTreeSelect'
 import { formatToTwoDecimalPlaces, isNumericString } from '@/utils';
 import { getMaterialWarehouseList } from '@/api/comprehensiveGuarantee/materialReserveManagement/godownManagement';
 
@@ -101,7 +88,6 @@ const props = defineProps({
 });
 
 const { proxy } = getCurrentInstance() as ComponentInternalInstance;
-const { material_type } = toRefs<any>(proxy?.useDict('material_type'));
 const emits = defineEmits(['close']);
 
 const formRef = ref();
@@ -110,9 +96,7 @@ let detailData = reactive({
   detail: []
 });
 const rules = reactive({
-  warehouse_id: [{ required: true, message: '请选择仓库', trigger: 'change' }],
-  material_type: [{ required: true, message: '请选择物资类型', trigger: 'change' }],
-  material_code: [{ required: true, message: '请选择物资名称', trigger: 'change' }],
+  material_name: [{ required: true, message: '请选择物资名称', trigger: 'change' }],
   material_quantity: [{ required: true, message: '请输入物资数量', trigger: 'blur' }],
   material_unit_price: [{ required: true, message: '请输入物资单价', trigger: 'blur' }],
   material_purpose: [{ required: true, message: '请输入物资用途', trigger: 'blur' }]
@@ -120,22 +104,7 @@ const rules = reactive({
 let buttonLoading = ref(false);
 let warehouseList = ref([]);
 let materialList = ref([]);
-// 新增一列
-const addDefaultRow = () => {
-  const newRow = {
-    warehouse_id: '',
-    material_type: '',
-    material_code: '',
-    material_quantity: '',
-    material_unit_price: '',
-    material_purpose: ''
-  };
-  detailData.detail.push(newRow);
-};
-// 选择仓库
-const handleWarehouseChange = () => {
 
-}
 // 计算总额
 const calcTotalAmount = () => {
   let total = new BigNumber('0');
@@ -148,7 +117,18 @@ const calcTotalAmount = () => {
   detailData.declaration_amount = total.toString();
 };
 
-const handleAddRow = () => addDefaultRow();
+const handleAddRow = () => {
+  const newRow = {
+    warehouse_id: '',
+    material_name: '',
+    material_type: '',
+    material_code: '',
+    material_quantity: '',
+    material_unit_price: '',
+    material_purpose: ''
+  };
+  detailData.detail.push(newRow);
+};
 
 const handleReturn = () => {
   emits('close');
@@ -186,6 +166,19 @@ const submitForm = async (formEl) => {
   });
 };
 
+let showSelect = ref(false);
+let selectIndex = ref('');
+const handleShowSelect = (index) => {
+  selectIndex.value = index;
+  showSelect.value = true;
+};
+const handleSelectChange = (data) => {
+  detailData.detail[selectIndex.value].material_code = data.id;
+  detailData.detail[selectIndex.value].material_name = data.label;
+  detailData.detail[selectIndex.value].warehouse_id = data.warehouse_id;
+  detailData.detail[selectIndex.value].material_type = data.type;
+};
+
 let height = ref(300);
 // 计算表格高度
 const calcHeight = () => {
@@ -199,7 +192,7 @@ onMounted(() => {
       detailData.detail = res.data.detail;
     });
   } else {
-    addDefaultRow();
+    handleAddRow();
   }
   getMaterialWarehouseList().then((res) => {
     warehouseList.value = res.data;
@@ -233,4 +226,17 @@ onUnmounted(() => {
 .el-form-item {
   margin: 18px 0;
 }
+:deep(.custom-disabled) {
+  .el-select__wrapper.is-disabled,
+  .el-input__wrapper,
+  .el-textarea__inner {
+    background-color: #ffffff !important;
+  }
+  .el-select__wrapper.is-disabled .el-select__selected-item,
+  .el-input__inner,
+  .el-textarea__inner {
+    color: rgba(0, 0, 0, 0.85) !important;
+    -webkit-text-fill-color: rgba(0, 0, 0, 0.85) !important;
+  }
+}
 </style>

+ 0 - 179
src/views/comprehensiveGuarantee/materialReserves/materialsDeclarationEidt.vue

@@ -1,179 +0,0 @@
-<template>
-  <div class="app-container p-2">
-    <el-row :gutter="20">
-      <el-col :span="6">
-        <h2>编辑</h2>
-        <el-form-item label="调度目的:">
-          <el-input v-model="queryParams.purpose" placeholder="请输入内容" clearable></el-input>
-        </el-form-item>
-      </el-col>
-      <el-col :lg="24" :xs="24">
-        <el-table :data="tableData" border height="400">
-          <el-table-column label="序号" prop="seqNo" width="80">
-            <template #default="{ $index }">
-              <span>{{ $index + 1 }}</span>
-            </template>
-          </el-table-column>
-          <el-table-column label="物资类型" prop="materialType">
-            <template #default="{ row, $index }">
-              <span
-                class="editable-span"
-                contenteditable="true"
-                @blur="saveEdit($index, 'materialType', $event.target.innerText)"
-                v-text="row.materialType"
-              ></span>
-            </template>
-          </el-table-column>
-          <el-table-column label="物资名称" prop="materialName">
-            <template #default="{ row, $index }">
-              <span
-                class="editable-span"
-                contenteditable="true"
-                @blur="saveEdit($index, 'materialName', $event.target.innerText)"
-                v-text="row.materialName"
-              ></span>
-            </template>
-          </el-table-column>
-          <el-table-column label="物资数量(件)" prop="quantity">
-            <template #default="{ row, $index }">
-              <span
-                class="editable-span"
-                contenteditable="true"
-                @blur="saveEdit($index, 'quantity', $event.target.innerText)"
-                v-text="row.quantity"
-              ></span>
-            </template>
-          </el-table-column>
-          <el-table-column label="物资用途" prop="materials">
-            <template #default="{ row, $index }">
-              <span
-                class="editable-span"
-                contenteditable="true"
-                @blur="saveEdit($index, 'materials', $event.target.innerText)"
-                v-text="row.materials"
-              ></span>
-            </template>
-          </el-table-column>
-        </el-table>
-      </el-col>
-      <div class="common-dialog-footer" style="width: 100%; justify-content: center; display: flex">
-        <el-row :span="24" :gutter="10" class="mb8">
-          <el-col :span="1.5">
-            <el-button type="primary" @click="handleAddRow">新增一项</el-button>
-          </el-col>
-          <el-col :span="1.5">
-            <el-button type="primary" @click="handleSave">提交</el-button>
-          </el-col>
-          <el-col :span="1.5">
-            <el-button type="danger" @click="handleReturn">取消</el-button>
-          </el-col>
-        </el-row>
-      </div>
-    </el-row>
-  </div>
-</template>
-
-<script setup lang="ts">
-import { ref, onMounted } from 'vue';
-import { ElTable, ElButton, ElCol, ElRow, ElTableColumn } from 'element-plus';
-import axios from 'axios'; // 引入axios
-
-// 定义父组件传递的属性
-const props = defineProps({
-  eventId: String
-});
-
-// 定义子组件触发的事件
-const emits = defineEmits(['close']);
-
-// 定义查询参数对象,包含调度目的
-const queryParams = ref({
-  purpose: '' // 调度目的
-});
-
-// 表格数据
-const tableData = ref([
-  { materialType: '三防物资', materialName: '雨衣', quantity: '100', materials: '高州泰利台风前置' },
-  { materialType: '三防物资', materialName: '水鞋', quantity: '10', materials: '高州泰利台风前置' },
-  { materialType: '三防物资', materialName: '雨伞', quantity: '50', materials: '高州泰利台风前置' }
-]);
-
-// 添加默认行
-const addDefaultRow = () => {
-  const newRow = {
-    materialType: '',
-    materialName: '',
-    quantity: '',
-    materials: ''
-  };
-  tableData.value.push(newRow);
-};
-
-// 保存编辑
-const saveEdit = (index: number, key: string, value: string) => {
-  if (key === 'quantity') {
-    const numValue = parseFloat(value);
-    if (isNaN(numValue)) {
-      return;
-    }
-    value = numValue.toString();
-  }
-  tableData.value[index][key] = value;
-};
-
-// 处理新增一行
-const handleAddRow = () => addDefaultRow();
-
-// 处理返回
-const handleReturn = () => {
-  emits('close');
-};
-
-// 处理保存
-const handleSave = async () => {
-  try {
-    const response = await axios.post('/api/submitData', { data: tableData.value, purpose: queryParams.value.purpose });
-    console.log('数据已成功提交:', response.data);
-  } catch (error) {
-    console.error('提交数据时发生错误:', error);
-  }
-};
-
-// 页面加载完成后执行
-onMounted(() => {
-  // 如果需要从后端加载数据,可以在这里调用相应的API
-});
-</script>
-
-<style scoped>
-.app-container {
-  font-family: Avenir, Helvetica, Arial, sans-serif;
-  -webkit-font-smoothing: antialiased;
-  -moz-osx-font-smoothing: grayscale;
-  text-align: center;
-  color: #2c3e50;
-}
-.report-period {
-  margin-top: 10px;
-  font-size: 14px;
-  color: #606266;
-}
-.editable-span {
-  cursor: pointer;
-  display: inline-block;
-  white-space: nowrap;
-  overflow: hidden;
-  text-overflow: ellipsis;
-}
-.editable-span[contenteditable='true'] {
-  white-space: normal;
-  outline: none; /* 移除编辑时的焦点边框 */
-}
-.editable-span[contenteditable='true']:empty::before {
-  content: attr(data-placeholder); /* 可选:为空时显示占位符 */
-  color: #999;
-}
-.common-dialog-footer {
-  margin-top: 20px;
-}
-</style>

+ 4 - 7
src/views/comprehensiveGuarantee/materialReserves/materialsDeclarationView.vue

@@ -3,7 +3,7 @@
     <div class="common-dialog-content">
       <div class="common-dialog-title-box">
         <i class="common-dialog-title-icon" />
-        <div>{{ props.id ? '修改物资申报' : '新增物资申报' }}</div>
+        <div>物资申报详情</div>
       </div>
       <div class="common-dialog-box">
         <el-row :gutter="20" style="width: 100%">
@@ -26,13 +26,10 @@
               <span>{{ $index + 1 }}</span>
             </template>
           </el-table-column>
-          <el-table-column label="物资类型" prop="material_type" align="center">
-            <template #default="scope">
-              <dict-tag :options="material_type" :value="scope.row.material_type" />
-            </template>
-          </el-table-column>
           <el-table-column label="物资名称" prop="material_name" align="center" />
-          <el-table-column label="物资数量(件)" prop="material_quantity" align="center"/>
+          <el-table-column label="仓库" prop="warehouse_name" align="center" />
+          <el-table-column label="物资类型" prop="material_category_name" align="center" />
+          <el-table-column label="物资数量(件)" prop="material_quantity" align="center" />
           <el-table-column label="物资单价(元)" prop="material_unit_price" align="center" />
           <el-table-column label="物资用途" prop="material_purpose" align="center" />
         </el-table>

+ 3 - 10
src/views/comprehensiveGuarantee/materialReserves/materialsDistribution.vue

@@ -1,6 +1,6 @@
 <template>
   <div class="app-container">
-    <div v-show="!materialsDistributionViewState.show && !materialsDeclarationEidtState.show && !materialsDistributionAddState.show">
+    <div v-show="!materialsDistributionViewState.show && !materialsDistributionAddState.show">
       <h1>物资储备管理</h1>
       <el-row :gutter="10" class="mb8">
         <el-col :span="1.5">
@@ -36,7 +36,6 @@
       />
     </div>
     <MaterialsDistributionView v-if="materialsDistributionViewState.show" :event-id="materialsDistributionViewState.eventId" @close="handleCancel" />
-    <MaterialsDeclarationEidt v-if="materialsDeclarationEidtState.show" :event-id="materialsDeclarationEidtState.eventId" @close="handleCancel" />
     <MaterialsDistributionAdd v-if="materialsDistributionAddState.show" @close="handleCancel" />
   </div>
 </template>
@@ -47,7 +46,6 @@ import { ElTable, ElTableColumn, ElButton, ElText } from 'element-plus';
 import { ComponentInternalInstance, getCurrentInstance } from 'vue';
 import Pagination from '@/components/Pagination/index.vue'; // 假设这是分页组件的路径
 import MaterialsDistributionView from './materialsDistributionView.vue'; // 查看详情组件
-import MaterialsDeclarationEidt from './materialsDeclarationEidt.vue'; // 编辑组件
 import MaterialsDistributionAdd from './materialsDistributionAdd.vue'; // 编辑组件
 const loading = ref(true);
 const showSearch = ref(true);
@@ -127,10 +125,6 @@ let materialsDistributionViewState = reactive({
   eventId: ''
 });
 
-let materialsDeclarationEidtState = reactive({
-  show: false,
-  eventId: ''
-});
 let materialsDistributionAddState = reactive({
   show: false,
   eventId: ''
@@ -145,13 +139,12 @@ const handleView = (row: any) => {
 };
 
 const handleUpdate = (row: any) => {
-  materialsDeclarationEidtState.eventId = row.id;
-  materialsDeclarationEidtState.show = true;
+  materialsDistributionAddState.eventId = row.id;
+  materialsDistributionAddState.show = true;
 };
 
 const handleCancel = () => {
   materialsDistributionViewState.show = false;
-  materialsDeclarationEidtState.show = false;
   materialsDistributionAddState.show = false;
 };
 

+ 2 - 0
src/views/globalMap/RightMenu/OnlinePlotting/CollaborativeUser.vue

@@ -31,6 +31,7 @@ const props = defineProps({
   modelValue: Boolean,
   patternId: String
 });
+const { proxy } = getCurrentInstance() as ComponentInternalInstance;
 const emits = defineEmits(['update:modelValue']);
 let allChecked = ref(false);
 let dataList = ref([]);
@@ -50,6 +51,7 @@ const handleCloseUser = (id) => {
     pattern_id: props.patternId,
     user_id: id
   }).then(() => {
+    proxy?.$modal.msgSuccess('关闭该用户协同成功');
     getList();
   });
 };