Pārlūkot izejas kodu

pms 手工入库 选择 工厂 成本中心

zhangcl 3 mēneši atpakaļ
vecāks
revīzija
fc0b29ef13

+ 2 - 0
src/api/pms/material/index.ts

@@ -12,6 +12,8 @@ export interface MaterialVO {
   sapCode: string
   status: number
   remark: string
+  unitPrice: number
+  quantity: number
   syncTime: Date
   createTime: Date
 }

+ 124 - 8
src/views/pms/iotlockstock/IotAddToStock.vue

@@ -1,4 +1,43 @@
 <template>
+  <ContentWrap v-loading="formLoading">
+    <el-form
+      ref="formRef"
+      :model="formData"
+      :rules="formRules"
+      v-loading="formLoading"
+      style="margin-right: 4em; margin-left: 0.5em; margin-top: 1em"
+      label-width="130px"
+    >
+      <div class="base-expandable-content">
+        <el-row>
+          <el-col :span="8">
+            <el-form-item label="工厂" prop="factoryId">
+              <el-select v-model="formData.factoryId" clearable placeholder="请选择工厂" class="!w-240px" @change="selectedFactoryChange">
+                <el-option
+                  v-for="item in factoryList"
+                  :key="item.id"
+                  :label="item.factoryName"
+                  :value="item.id!"
+                />
+              </el-select>
+            </el-form-item>
+          </el-col>
+          <el-col :span="8">
+            <el-form-item label="成本中心" prop="costCenterId">
+              <el-select v-model="formData.costCenterId" clearable placeholder="请选择成本中心" class="!w-240px">
+                <el-option
+                  v-for="item in costCenterList"
+                  :key="item.id"
+                  :label="item.costCenterName"
+                  :value="item.id!"
+                />
+              </el-select>
+            </el-form-item>
+          </el-col>
+        </el-row>
+      </div>
+    </el-form>
+  </ContentWrap>
   <ContentWrap>
     <ContentWrap>
       <!-- 搜索工作栏 -->
@@ -19,19 +58,23 @@
     <!-- 列表 -->
     <ContentWrap>
       <el-table v-loading="loading" :data="list" :stripe="true" :show-overflow-tooltip="true">
+        <el-table-column label="工厂id" align="center" prop="factoryId" v-if="false"/>
+        <el-table-column label="成本中心id" align="center" prop="costCenterId" v-if="false"/>
         <el-table-column label="物料编码" align="center" prop="materialCode" />
         <el-table-column label="物料名称" align="center" prop="materialName" />
         <el-table-column label="单位" align="center" prop="unit" />
-        <el-table-column label="单价" align="center" prop="unitPrice" :formatter="erpPriceTableColumnFormatter">
+        <el-table-column label="单价" align="center" prop="unitPrice" :formatter="erpPriceTableColumnFormatter" />
+          <!--
           <template #default="scope">
             <el-input v-model="scope.row.unitPrice" />
           </template>
-        </el-table-column>
-        <el-table-column label="数量" align="center" prop="quantity" :formatter="erpPriceTableColumnFormatter">
+        </el-table-column> -->
+        <el-table-column label="数量" align="center" prop="quantity" :formatter="erpPriceTableColumnFormatter" />
+          <!--
           <template #default="scope">
             <el-input v-model="scope.row.quantity" />
           </template>
-        </el-table-column>
+        </el-table-column> -->
         <el-table-column label="备注" align="center" prop="remark">
           <template #default="scope">
             <el-input v-model="scope.row.remark" />
@@ -78,6 +121,9 @@ import { toRaw } from "vue";
 import { useTagsViewStore } from '@/store/modules/tagsView'
 import MaterialSelect from "@/views/pms/iotlockstock/SelectMaterial.vue";
 import {erpPriceTableColumnFormatter} from "@/utils";
+import {DICT_TYPE, getIntDictOptions} from "@/utils/dict";
+import {SapOrgApi, SapOrgVO} from "@/api/system/saporg";
+import * as DeptApi from '@/api/system/dept'
 
 /** 手工入库 表单 */
 defineOptions({ name: 'IotAddToStock' })
@@ -91,11 +137,20 @@ const formLoading = ref(false) // 表单的加载中:1)修改时的数据加
 const list = ref<IotLockStockVO[]>([]) // 入库物料的数据
 const { params, name } = useRoute() // 查询参数
 
+const factoryList = ref([] as SapOrgVO[])   // 工厂列表
+const storageLocationList = ref([] as SapOrgVO[]) // 库存地点列表
+const costCenterList = ref([] as SapOrgVO[]) // SAP成本中心列表
+const dept = ref() // 当前登录人所属部门对象
 const materialFormRef = ref()
 const openForm = () => {
   materialFormRef.value.open()
 }
 
+const selectedFactoryReqVO = ref({
+  type: 0, // 类型(1工厂 2成本中心 3库位)
+  factoryCodes: [] // 已经选择的SAP工厂code 列表
+})
+
 const formRef = ref() // 表单 Ref
 
 const close = () => {
@@ -103,6 +158,22 @@ const close = () => {
   push({ name: 'IotLockStock', params:{}})
 }
 
+const formData = ref({
+  id: undefined,
+  deptId: undefined,
+  factoryId: 0,
+  factory: '',
+  storageLocationId: 0,
+  projectDepartment: '',
+  costCenterId: undefined,
+  costCenter: ''
+})
+
+const formRules = reactive({
+  factoryId: [{ required: true, message: '工厂不能为空', trigger: 'blur' }],
+  costCenterId: [{ required: true, message: '成本中心不能为空', trigger: 'blur' }],
+})
+
 // 多选 物料
 const materialChoose = (selectedMaterials) => {
   // 转换数据结构(根据你的接口定义调整)
@@ -110,8 +181,8 @@ const materialChoose = (selectedMaterials) => {
     materialCode: material.code,
     materialName: material.name,
     unit: material.unit,
-    quantity: null,  // 初始化数量
-    unitPrice: null, // 初始化单价
+    quantity: material.quantity,  // 初始化数量
+    unitPrice: material.unitPrice, // 初始化单价
     remark: null,    // 初始化备注
     code: material.code // 移除操作需要
   }))
@@ -130,6 +201,18 @@ const materialChoose = (selectedMaterials) => {
 /** 提交表单 */
 const emit = defineEmits(['success']) // 定义 success 事件,用于操作成功后的回调
 const submitForm = async () => {
+  if (formData.value.factoryId === undefined) {
+    message.error('请选择工厂')
+    return
+  }
+  if (formData.value.costCenterId === undefined) {
+    message.error('请选择成本中心')
+    return
+  }
+  if (toRaw(list.value).length == 0) {
+    message.error('请选择物料')
+    return
+  }
   if (toRaw(list.value).length == 0) {
     message.error('请选择物料')
     return
@@ -149,10 +232,17 @@ const submitForm = async () => {
       return
     }
   }
+
   // 提交请求
   formLoading.value = true
   try {
-    await IotLockStockApi.manualWarehouse(list.value)
+    // 合并工厂和成本中心到每条物料记录
+    const submitList = list.value.map(item => ({
+      ...item,
+      factoryId: formData.value.factoryId,
+      costCenterId: formData.value.costCenterId
+    }))
+    await IotLockStockApi.manualWarehouse(submitList)
     message.success(t('common.createSuccess'))
     close()
     // 发送操作成功的事件
@@ -162,13 +252,39 @@ const submitForm = async () => {
   }
 }
 
+/** 已经选择了 SAP工厂 */
+const selectedFactoryChange = async (selectedId: number | undefined) => {
+
+  // 获取选中的factoryCode数组
+  const selectedFactory = factoryList.value.find(item => item.id === selectedId)
+  const selectedFactoryCodes = selectedFactory ? [selectedFactory.factoryCode] : []
+
+  // 获得已经选择的 SAP 工厂 数组
+  // 根据选择的 SAP工厂 调用后台接口查询 SAP工厂下属的 成本中心
+  selectedFactoryReqVO.value.type = 2
+  selectedFactoryReqVO.value.factoryCodes = selectedFactoryCodes
+  costCenterList.value = await SapOrgApi.getSelectedList(selectedFactoryReqVO.value)
+}
+
 /** 重置表单 */
 const resetForm = () => {
   formRef.value?.resetFields()
 }
 onMounted(async () => {
+  // 加载当前登录人所属部门 关联的 工厂 成本中心 库存地点 如果有多个 随机取1个
   const deptId = useUserStore().getUser.deptId
-  // deptUsers.value = await UserApi.getDeptUsersByDeptId(deptId)
+  dept.value = await DeptApi.getDept(deptId)
+  // 加载工厂(SAP) 全集
+  factoryList.value = await SapOrgApi.getSimpleSapOrgList(1)
+  // 成本中心 全集
+  costCenterList.value = await SapOrgApi.getSimpleSapOrgList(2)
+  if (dept.value.factoryIds[0] !== undefined) {
+    formData.value.factoryId = dept.value.factoryIds[0]
+    await selectedFactoryChange(formData.value.factoryId)
+  }
+  if (dept.value.costCenterIds[0] !== undefined) {
+    formData.value.costCenterId = dept.value.costCenterIds[0]
+  }
 })
 
 // 调整删除逻辑

+ 31 - 8
src/views/pms/iotlockstock/SelectMaterial.vue

@@ -68,18 +68,30 @@
           />
           <el-table-column label="规格型号" align="center" prop="model" width="120" />
           <el-table-column label="单位" align="center" prop="unit" width="120" />
+          <el-table-column label="单价" align="center" prop="unitPrice">
+            <template #default="scope">
+              <el-input
+                v-model="scope.row.unitPrice"
+                @click.stop=""
+                @focus="handleInputFocus(scope.row)"
+              />
+            </template>
+          </el-table-column>
+          <el-table-column label="数量" align="center" prop="quantity">
+            <template #default="scope">
+              <el-input
+                v-model="scope.row.quantity"
+                @click.stop=""
+                @focus="handleInputFocus(scope.row)"
+              />
+            </template>
+          </el-table-column>
+          <!--
           <el-table-column label="状态" key="status">
             <template #default="scope">
               <dict-tag :type="DICT_TYPE.COMMON_STATUS" :value="scope.row.status" />
             </template>
-          </el-table-column>
-          <el-table-column
-            label="创建时间"
-            align="center"
-            prop="createTime"
-            :formatter="dateFormatter"
-            width="180"
-          />
+          </el-table-column> -->
         </el-table>
         <!-- 分页 -->
         <Pagination
@@ -100,6 +112,8 @@ import * as MaterialApi from '@/api/pms/material'
 import {DICT_TYPE} from "@/utils/dict";
 import {ContentWrap} from "@/components/ContentWrap";
 
+defineOptions({ name: 'SelectMaterial' })
+
 // 调整 emit 类型
 const emit = defineEmits<{
   (e: 'choose', value: MaterialApi.MaterialVO[]): void
@@ -186,6 +200,15 @@ const getList = async () => {
   }
 }
 
+// 处理输入框焦点事件(自动选中当前行)
+const handleInputFocus = (row: MaterialApi.MaterialVO) => {
+  // 如果未选中则添加到选中列表
+  const exists = selectedRows.value.some(item => item.id === row.id)
+  if (!exists) {
+    selectedRows.value.push(row)
+  }
+}
+
 /** 搜索按钮操作 */
 const handleQuery = () => {
   queryParams.pageNo = 1

+ 2 - 0
src/views/pms/iotlockstock/index.vue

@@ -18,6 +18,7 @@
           />
         </el-select>
       </el-form-item>
+      <!--
       <el-form-item label="库存地点" prop="storageLocationId">
         <el-select v-model="queryParams.storageLocationId" clearable placeholder="请选择" class="!w-240px">
           <el-option
@@ -28,6 +29,7 @@
           />
         </el-select>
       </el-form-item>
+      -->
       <el-form-item label="成本中心" prop="costCenterId">
         <el-select v-model="queryParams.costCenterId" clearable placeholder="请选择" class="!w-240px">
           <el-option