Ver código fonte

景聚庭-商品管理功能调整

huangguoce 1 semana atrás
pai
commit
ef64bc3f21

+ 0 - 44
api/psi/SupplierService.js

@@ -1,44 +0,0 @@
-import request from "../../common/request"
-import { PSI_MANAGEMANT as prefix } from "../AppPath";
-
-export default class SupplierService {
-  save(param) {
-    return request({
-      url: prefix + '/psi/supplier/save',
-      method: 'post',
-      data: param
-    })
-  }
-
-  queryById(id) {
-    return request({
-      url: prefix + '/psi/supplier/queryById',
-      method: 'get',
-      params: { id: id }
-    })
-  }
-
-  list(param) {
-    return request({
-      url: prefix + '/psi/supplier/list',
-      method: 'get',
-      params: param
-    })
-  }
-
-  delete(ids) {
-    return request({
-      url: prefix + '/psi/supplier/delete',
-      method: 'delete',
-      params: { ids: ids }
-    })
-  }
-
-  findByName(name) {
-    return request({
-      url: prefix + '/psi/supplier/findByName',
-      method: 'get',
-      params: { name: name }
-    })
-  }
-}

Diferenças do arquivo suprimidas por serem muito extensas
+ 820 - 804
pages/psiManagement/collect/CollectForm.vue


+ 28 - 17
pages/psiManagement/collect/CollectGoodsSelector.vue

@@ -21,6 +21,14 @@
                     <view class="selector-card" v-for="item in filteredList" :key="item.id || item.tradeName"
                         @tap="selectItem(item)">
                         <view class="selector-name">{{ item.tradeName || '-' }}</view>
+                        <view class="selector-meta">
+                            <text>库存:{{ item.currentInventory || item.surplusNumber || '0' }}</text>
+                            <text v-if="item.company">单位:{{ item.company }}</text>
+                        </view>
+                        <view class="selector-meta" v-if="item.brand || item.specification">
+                            <text v-if="item.brand">品牌:{{ item.brand }}</text>
+                            <text v-if="item.specification">规格:{{ item.specification }}</text>
+                        </view>
                     </view>
                 </view>
             </scroll-view>
@@ -29,7 +37,7 @@
 </template>
 
 <script>
-import WareHouseService from '@/api/psi/WareHouseService'
+import MaterialTypeService from '@/api/psi/MaterialTypeService'
 
 export default {
     name: 'PsiCollectGoodsSelector',
@@ -44,7 +52,7 @@ export default {
             loading: false,
             keyword: '',
             goodsList: [],
-            wareHouseService: null
+            materialTypeService: null
         }
     },
     computed: {
@@ -52,7 +60,7 @@ export default {
             return (this.inputForm.detailInfos || [])[this.rowIndex] || {}
         },
         currentValue() {
-            return this.currentRow.goodsName || ''
+            return this.currentRow.collectType || this.currentRow.goodsName || ''
         },
         filteredList() {
             const keyword = (this.keyword || '').trim().toLowerCase()
@@ -63,7 +71,7 @@ export default {
         }
     },
     created() {
-        this.wareHouseService = new WareHouseService()
+        this.materialTypeService = new MaterialTypeService()
     },
     methods: {
         isEmpty(value) {
@@ -82,13 +90,6 @@ export default {
             if (this.disabled) {
                 return
             }
-            if (this.isEmpty(this.currentRow.collectTypeId)) {
-                uni.showToast({
-                    title: '请先选择领用类型',
-                    icon: 'none'
-                })
-                return
-            }
             this.visible = true
             this.keyword = ''
             await this.loadGoodsList()
@@ -99,12 +100,13 @@ export default {
         async loadGoodsList() {
             this.loading = true
             try {
-                const data = await this.wareHouseService.getByProduceDateAndNameGroup({
-                    current: 1,
-                    size: 1000,
-                    wareHouseType: this.currentRow.collectTypeId
-                })
-                this.goodsList = (data && data.records) || []
+                const data = await this.materialTypeService.cgList()
+                this.goodsList = (data || []).filter(item => {
+                    return String(item.infoType || item.info_type || '') === '1'
+                }).map(item => ({
+                    ...item,
+                    tradeName: item.tradeName || item.name || ''
+                }))
             } catch (e) {
                 this.goodsList = []
                 uni.showToast({
@@ -221,4 +223,13 @@ export default {
     font-weight: 600;
     color: #0f172a;
 }
+
+.selector-meta {
+    display: flex;
+    gap: 16rpx;
+    margin-top: 10rpx;
+    font-size: 24rpx;
+    color: #64748b;
+    flex-wrap: wrap;
+}
 </style>

+ 82 - 47
pages/psiManagement/loss/LossForm.vue

@@ -39,31 +39,36 @@
                     <u-form-item label="报损人部门" :prop="'detailInfos[' + index + '].recipientOffice'">
                         <u--input v-model="inputForm.detailInfos[index].recipientOffice" disabled></u--input>
                     </u-form-item>
-                    <u-form-item label="报损类型" :prop="'detailInfos[' + index + '].collectType'" :required="true">
-                        <u--input v-model="inputForm.detailInfos[index].collectType" placeholder="请选择报损类型"
-                            :disabled="nodeFlag" @focus="openTypePicker(index)" clearable></u--input>
-                    </u-form-item>
-
                     <loss-goods-selector :rowIndex="index" :inputForm="inputForm" :disabled="nodeFlag"
                         @selected="handleGoodsSelected"></loss-goods-selector>
 
-                    <u-form-item label="包装规格" :prop="'detailInfos[' + index + '].spec'">
-                        <u--input v-model="inputForm.detailInfos[index].spec" disabled></u--input>
+                    <u-form-item label="品牌" :prop="'detailInfos[' + index + '].brand'">
+                        <u--input v-model="inputForm.detailInfos[index].brand" disabled></u--input>
+                    </u-form-item>
+                    <u-form-item label="规格" :prop="'detailInfos[' + index + '].specification'">
+                        <u--input v-model="inputForm.detailInfos[index].specification" disabled></u--input>
+                    </u-form-item>
+                    <u-form-item label="单位" :prop="'detailInfos[' + index + '].company'">
+                        <u--input v-model="inputForm.detailInfos[index].company" disabled></u--input>
+                    </u-form-item>
+                    <u-form-item label="入库批次" :prop="'detailInfos[' + index + '].wareHouseNumber'">
+                        <u--input v-model="inputForm.detailInfos[index].wareHouseNumber" disabled></u--input>
                     </u-form-item>
-                    <u-form-item label="生产日期" :prop="'detailInfos[' + index + '].produceDate'">
-                        <u--input :value="formatDisplayDate(inputForm.detailInfos[index].produceDate)" disabled>
+                    <u-form-item label="入库日期" :prop="'detailInfos[' + index + '].wareHouseDate'">
+                        <u--input :value="formatDisplayDate(inputForm.detailInfos[index].wareHouseDate)" disabled>
                         </u--input>
                     </u-form-item>
-                    <!-- <u-form-item label="库存数量" :prop="'detailInfos[' + index + '].surplusNumber'">
+                    <u-form-item label="批次库存" :prop="'detailInfos[' + index + '].surplusNumber'">
                         <u--input v-model="inputForm.detailInfos[index].surplusNumber" disabled></u--input>
-                    </u-form-item> -->
-                    <!-- <u-form-item label="单位" :prop="'detailInfos[' + index + '].company'">
-                        <u--input v-model="inputForm.detailInfos[index].company" disabled></u--input>
-                    </u-form-item> -->
+                    </u-form-item>
                     <u-form-item label="报损数量" :prop="'detailInfos[' + index + '].lossNumber'" :required="true">
                         <u--input v-model="inputForm.detailInfos[index].lossNumber" placeholder="请输入报损数量"
                             :disabled="nodeFlag" @blur="handleLossNumberBlur(index)"></u--input>
                     </u-form-item>
+                    <u-form-item label="报损原因" :prop="'detailInfos[' + index + '].lossReason'" :required="true">
+                        <u--textarea v-model="inputForm.detailInfos[index].lossReason" placeholder="请输入报损原因"
+                            :disabled="nodeFlag" :rows="3" :maxlength="200"></u--textarea>
+                    </u-form-item>
                     <u-form-item label="附件上传">
                         <UploadComponent :uploadUrl="`${uploadUrl}/public-modules-server/oss/file/webUpload/upload`"
                             @onRemove="(file, fileList, fileIndex) => handleRemove(file, fileList, index, fileIndex, 'detail')"
@@ -211,12 +216,18 @@ export default {
                 collectType: '',
                 collectTypeId: '',
                 goodsName: '',
+                inventoryId: '',
                 lossNumber: '',
+                lossReason: '',
                 company: '',
+                brand: '',
+                specification: '',
+                wareHouseNumber: '',
+                wareHouseDate: '',
                 produceDate: '',
                 shelfLife: '',
                 shelfLifeUnit: '',
-                spec: '',
+                spec: '1',
                 surplusNumber: '',
                 currentInventory: '',
                 fileInfoLost: []
@@ -359,6 +370,14 @@ export default {
             }
             return numberValue % 1 === 0 ? String(numberValue) : numberValue.toFixed(2).replace(/\.?0+$/, '')
         },
+        formatBatchStock(currentInventory, spec) {
+            const current = Number(currentInventory || 0)
+            const specNumber = Number(spec || 1)
+            if (Number.isNaN(current) || Number.isNaN(specNumber)) {
+                return '0'
+            }
+            return this.formatNumber(current * (specNumber > 0 ? specNumber : 1))
+        },
         formatNumberInput(inputValue, decimalLimit = 2) {
             if (this.isEmpty(inputValue)) {
                 return ''
@@ -383,10 +402,6 @@ export default {
             return value
         },
         addDetail() {
-            if (this.inputForm.detailInfos.length > 0) {
-                this.$message.warning('报损明细只能保留一条')
-                return
-            }
             this.inputForm.detailInfos.push(this.createDetailRow())
         },
         removeDetail(index) {
@@ -426,27 +441,40 @@ export default {
                 collectType: names,
                 collectTypeId: ids[0],
                 goodsName: '',
+                inventoryId: '',
                 company: '',
+                brand: '',
+                specification: '',
+                wareHouseNumber: '',
+                wareHouseDate: '',
                 produceDate: '',
                 shelfLife: '',
                 shelfLifeUnit: '',
-                spec: '',
+                spec: '1',
                 surplusNumber: '',
                 currentInventory: '',
                 lossNumber: ''
             })
         },
         async handleGoodsSelected({ index, item }) {
+            const stock = this.formatBatchStock(item.currentInventory, item.spec)
             this.patchDetail(index, {
+                inventoryId: item.id || '',
+                collectType: item.tradeName || '',
+                collectTypeId: item.wareHouseType || '',
                 goodsName: item.tradeName || '',
                 company: item.company || '',
+                brand: item.brand || '',
+                specification: item.specification || '',
+                wareHouseNumber: item.wareHouseNumber || '',
+                wareHouseDate: this.isNotEmpty(item.wareHouseDate) ? new Date(item.wareHouseDate) : '',
                 produceDate: this.isNotEmpty(item.produceDate) ? new Date(item.produceDate) : '',
                 shelfLife: item.shelfLife || '',
                 shelfLifeUnit: item.shelfLifeUnit || '',
-                spec: item.spec || '',
-                currentInventory: item.currentInventory || ''
+                spec: item.spec || '1',
+                currentInventory: item.currentInventory || '',
+                surplusNumber: stock
             })
-            await this.syncDetailStock(index)
         },
         async syncDetailStock(index) {
             const detail = (this.inputForm.detailInfos || [])[index]
@@ -506,30 +534,37 @@ export default {
                 this.$message.error('请填写报损明细')
                 return false
             }
-            if (this.inputForm.detailInfos.length !== 1) {
-                this.$message.error('报损明细只能保留一条')
-                return false
-            }
-            const detail = this.inputForm.detailInfos[0]
-            if (this.isEmpty(detail.recipientAgentId)) {
-                this.$message.error('请选择报损人')
-                return false
-            }
-            if (this.isEmpty(detail.collectTypeId)) {
-                this.$message.error('请选择报损类型')
-                return false
-            }
-            if (this.isEmpty(detail.goodsName)) {
-                this.$message.error('请选择物品名称')
-                return false
-            }
-            if (this.isEmpty(detail.lossNumber)) {
-                this.$message.error('请输入报损数量')
-                return false
-            }
-            if (checkStock && this.isNotEmpty(detail.surplusNumber) && Number(detail.lossNumber) > Number(detail.surplusNumber)) {
-                this.$message.error('报损数量不能大于当前库存')
-                return false
+            for (let index = 0; index < this.inputForm.detailInfos.length; index++) {
+                const detail = this.inputForm.detailInfos[index]
+                const lineNo = index + 1
+                if (this.isEmpty(detail.recipientAgentId)) {
+                    this.$message.error(`报损明细第${lineNo}行请选择报损人`)
+                    return false
+                }
+                if (this.isEmpty(detail.collectTypeId)) {
+                    this.$message.error(`报损明细第${lineNo}行请选择报损类型`)
+                    return false
+                }
+                if (this.isEmpty(detail.goodsName)) {
+                    this.$message.error(`报损明细第${lineNo}行请选择物品名称`)
+                    return false
+                }
+                if (this.isEmpty(detail.inventoryId)) {
+                    this.$message.error(`报损明细第${lineNo}行请选择报损库存批次`)
+                    return false
+                }
+                if (this.isEmpty(detail.lossNumber)) {
+                    this.$message.error(`报损明细第${lineNo}行请输入报损数量`)
+                    return false
+                }
+                if (this.isEmpty(detail.lossReason)) {
+                    this.$message.error(`报损明细第${lineNo}行请输入报损原因`)
+                    return false
+                }
+                if (checkStock && this.isNotEmpty(detail.surplusNumber) && Number(detail.lossNumber) > Number(detail.surplusNumber)) {
+                    this.$message.error(`报损明细第${lineNo}行报损数量不能大于当前库存`)
+                    return false
+                }
             }
             return true
         },

+ 14 - 18
pages/psiManagement/loss/LossGoodsSelector.vue

@@ -1,7 +1,7 @@
 <template>
     <view>
-        <u-form-item label="物品名称" :prop="'detailInfos[' + rowIndex + '].goodsName'" :required="true">
-            <u--input :value="currentValue" placeholder="请选择物品名称" readonly :disabled="disabled"
+        <u-form-item label="库存批次" :prop="'detailInfos[' + rowIndex + '].goodsName'" :required="true">
+            <u--input :value="currentValue" placeholder="请选择报损库存批次" readonly :disabled="disabled"
                 @focus="openPicker"></u--input>
         </u-form-item>
 
@@ -9,26 +9,30 @@
         <view class="selector-panel" :class="{ show: visible }">
             <view class="selector-header">
                 <view class="selector-action" @tap="closePicker">取消</view>
-                <view class="selector-title">选择物品</view>
+                <view class="selector-title">选择库存批次</view>
                 <view class="selector-action selector-action-placeholder">取消</view>
             </view>
             <view class="selector-search">
-                <u-search :show-action="false" v-model="keyword" placeholder="搜索品名称"></u-search>
+                <u-search :show-action="false" v-model="keyword" placeholder="搜索品名称"></u-search>
             </view>
             <scroll-view scroll-y class="selector-list">
                 <view v-if="loading" class="selector-state">加载中...</view>
-                <view v-else-if="filteredList.length === 0" class="selector-state">暂无可选物品</view>
+                <view v-else-if="filteredList.length === 0" class="selector-state">暂无可选批次</view>
                 <view v-else class="selector-list-inner">
                     <view class="selector-card" v-for="item in filteredList" :key="item.id || item.tradeName + item.produceDate"
                         @tap="selectItem(item)">
                         <view class="selector-name">{{ item.tradeName || '-' }}</view>
                         <view class="selector-meta">
-                            <text>生产日期:{{ formatDisplayDate(item.produceDate) || '暂无' }}</text>
+                            <text>入库批次:{{ item.wareHouseNumber || '-' }}</text>
+                            <text>入库日期:{{ formatDisplayDate(item.wareHouseDate) || '-' }}</text>
+                        </view>
+                        <view class="selector-meta">
                             <text>库存:{{ item.stockBottleCount || '0' }}</text>
+                            <text v-if="item.company">单位:{{ item.company }}</text>
                         </view>
                         <view class="selector-meta">
-                            <text>单位:{{ item.company || '-' }}</text>
-                            <text>规格:{{ item.spec || '-' }}</text>
+                            <text>品牌:{{ item.brand || '-' }}</text>
+                            <text>规格:{{ item.specification || '-' }}</text>
                         </view>
                     </view>
                 </view>
@@ -116,13 +120,6 @@ export default {
             if (this.disabled) {
                 return
             }
-            if (this.isEmpty(this.currentRow.collectTypeId)) {
-                uni.showToast({
-                    title: '请先选择报损类型',
-                    icon: 'none'
-                })
-                return
-            }
             this.visible = true
             this.keyword = ''
             await this.loadGoodsList()
@@ -135,11 +132,10 @@ export default {
             try {
                 const data = await this.wareHouseService.getByProduceDateNotMerge({
                     current: 1,
-                    size: 1000,
-                    wareHouseType: this.currentRow.collectTypeId
+                    size: 1000
                 })
                 const records = (data && data.records) || []
-                this.goodsList = records.map(item => ({
+                this.goodsList = records.filter(item => Number(item.currentInventory || 0) > 0).map(item => ({
                     ...item,
                     stockBottleCount: this.getStockBottleCount(item)
                 }))

+ 14 - 28
pages/psiManagement/purchase/GoodsSelector.vue

@@ -22,9 +22,10 @@
                     <view class="goods-card" v-for="item in filteredList" :key="item.id || item.tradeName"
                         @tap="selectItem(item)">
                         <view class="goods-name">{{ item.tradeName }}</view>
-                        <view class="goods-meta" v-if="item.company || item.spec">
+                        <view class="goods-meta" v-if="item.brand || item.specification || item.company">
+                            <text v-if="item.brand">品牌:{{ item.brand }}</text>
+                            <text v-if="item.specification">规格:{{ item.specification }}</text>
                             <text v-if="item.company">单位:{{ item.company }}</text>
-                            <text v-if="item.spec">规格:{{ item.spec }}</text>
                         </view>
                     </view>
                 </view>
@@ -34,8 +35,7 @@
 </template>
 
 <script>
-import MaterialManagementService from '@/api/psi/MaterialManagementService'
-import WareHouseService from '@/api/psi/WareHouseService'
+import MaterialTypeService from '@/api/psi/MaterialTypeService'
 
 export default {
     name: 'GoodsSelector',
@@ -50,8 +50,7 @@ export default {
             loading: false,
             keyword: '',
             goodsList: [],
-            materialManagementService: null,
-            wareHouseService: null
+            materialTypeService: null
         }
     },
     computed: {
@@ -70,8 +69,7 @@ export default {
         }
     },
     created() {
-        this.materialManagementService = new MaterialManagementService()
-        this.wareHouseService = new WareHouseService()
+        this.materialTypeService = new MaterialTypeService()
     },
     methods: {
         isEmpty(value) {
@@ -108,10 +106,14 @@ export default {
         async loadGoodsList() {
             this.loading = true
             try {
-                const data = await this.materialManagementService.findTradeByTypeId(this.currentRow.procurementTypeId)
-                this.goodsList = (data || []).map(item => ({
+                const data = await this.materialTypeService.cgList()
+                this.goodsList = (data || []).filter(item => {
+                    const parentId = item.parentId || item.parent_id || ''
+                    return String(item.infoType || item.info_type || '') === '1' &&
+                        (!this.currentRow.procurementTypeId || parentId === this.currentRow.procurementTypeId)
+                }).map(item => ({
                     ...item,
-                    tradeName: item.tradeName || ''
+                    tradeName: item.tradeName || item.name || ''
                 }))
             } catch (e) {
                 this.goodsList = []
@@ -124,25 +126,9 @@ export default {
             }
         },
         async selectItem(item) {
-            let selected = { ...item }
-            try {
-                const data = await this.wareHouseService.wareHouseSummaryList({
-                    current: 1,
-                    size: 20,
-                    tradeName: item.tradeName,
-                    wareHouseType: this.currentRow.procurementTypeId,
-                    orders: []
-                })
-                const records = (data && data.records) || []
-                if (records.length > 0) {
-                    selected = { ...records[0], ...selected }
-                }
-            } catch (e) {
-            }
-
             this.$emit('selected', {
                 index: this.index_experience,
-                item: selected
+                item
             })
             this.closePicker()
         }

+ 37 - 32
pages/psiManagement/purchase/PurchaseForm.vue

@@ -68,12 +68,6 @@
                         <u--input v-model="inputForm.detailInfos[index_experience].tradeName" placeholder="请选择物品名称" clearable></u--input>
                     </u-form-item>-->
 
-                    <supplier-selector :index_experience="index_experience" :inputForm="inputForm"></supplier-selector>
-                    <!--                    <u-form-item label="供应商" :prop="'detailInfos[' + index_experience + '].supplierName'" -->
-                    <!--                                 :rules="[-->
-                    <!--				     ]">-->
-                    <!--                        <u--input v-model="inputForm.detailInfos[index_experience].supplierName" placeholder="请选择供应商" @focus="showGoods(index_experience)" clearable></u--input>-->
-                    <!--                    </u-form-item>-->
                     <u-form-item label="商品单价(元)" :prop="'detailInfos[' + index_experience + '].tradePrice'" :rules="[
                     ]">
                         <u--input @blur="onInputCode(index_experience, $event, 'tradePrice')"
@@ -91,10 +85,16 @@
                         <u--input v-model="inputForm.detailInfos[index_experience].priceSum" placeholder="请输入商品总价"
                             :readonly="true" clearable></u--input>
                     </u-form-item>
+                    <u-form-item label="品牌" :prop="'detailInfos[' + index_experience + '].brand'">
+                        <u--input v-model="inputForm.detailInfos[index_experience].brand" disabled></u--input>
+                    </u-form-item>
+                    <u-form-item label="规格" :prop="'detailInfos[' + index_experience + '].specification'">
+                        <u--input v-model="inputForm.detailInfos[index_experience].specification" disabled></u--input>
+                    </u-form-item>
                     <u-form-item label="单位" :prop="'detailInfos[' + index_experience + '].company'" :rules="[
                     ]">
                         <u--input v-model="inputForm.detailInfos[index_experience].company" placeholder="请输入单位"
-                            clearable></u--input>
+                            disabled></u--input>
                     </u-form-item>
                     <u-form-item label="备注" :prop="'detailInfos[' + index_experience + '].remarks'" :rules="[
                     ]">
@@ -226,13 +226,6 @@
                     <!--				     ]">-->
                     <!--                        <el-input v-model="inputForm.detailInfos[index_experience].tradeName" placeholder="请选择物品名称" @focus="showGoods(index_experience)" clearable></el-input>-->
                     <!--                    </u-form-item>-->
-                    <supplier-selector :index_experience="index_experience" :disabled="true"
-                        :inputForm="inputForm"></supplier-selector>
-                    <!--                    <u-form-item label="供应商" :prop="'detailInfos[' + index_experience + '].supplierName'" -->
-                    <!--                                 :rules="[-->
-                    <!--				     ]">-->
-                    <!--                        <el-input v-model="inputForm.detailInfos[index_experience].supplierName" placeholder="请选择供应商" @focus="showGoods(index_experience)" clearable></el-input>-->
-                    <!--                    </u-form-item>-->
                     <u-form-item label="商品单价(元)" :prop="'detailInfos[' + index_experience + '].tradePrice'" :rules="[
                     ]">
                         <el-input @change="changeValue" :disabled="true"
@@ -249,6 +242,12 @@
                         <el-input v-model="inputForm.detailInfos[index_experience].priceSum" :disabled="true"
                             placeholder="请输入商品总价" clearable></el-input>
                     </u-form-item>
+                    <u-form-item label="品牌" :prop="'detailInfos[' + index_experience + '].brand'">
+                        <el-input v-model="inputForm.detailInfos[index_experience].brand" :disabled="true"></el-input>
+                    </u-form-item>
+                    <u-form-item label="规格" :prop="'detailInfos[' + index_experience + '].specification'">
+                        <el-input v-model="inputForm.detailInfos[index_experience].specification" :disabled="true"></el-input>
+                    </u-form-item>
                     <u-form-item label="单位" :prop="'detailInfos[' + index_experience + '].company'" :rules="[
                     ]">
                         <el-input v-model="inputForm.detailInfos[index_experience].company" :disabled="true"
@@ -327,7 +326,6 @@
 <script>
 import userSelect from '@/components/user-select/user-select-radio.vue'
 import OSSService from "@/api/sys/OSSService"
-import SupplierSelector from './SupplierSelector';
 import GoodsSelector from './GoodsSelector.vue';
 import MaterialTypeService from '@/api/psi/MaterialTypeService'
 import MaterialManagementService from '@/api/psi/MaterialManagementService'
@@ -342,7 +340,6 @@ export default {
         userSelect,
         baTreePicker,
         GoodsSelector,
-        'supplier-selector': SupplierSelector,
         UploadComponent
     },
     computed: mapState({
@@ -422,6 +419,9 @@ export default {
         this.inputForm.userId = this.userInfo.id
         this.inputForm.handledByOffice = this.userInfo.officeDTO.id
         this.inputForm.handledByOfficeName = this.userInfo.officeDTO.name
+        if (!this.inputForm.purchaseSketch) {
+            this.inputForm.purchaseSketch = `${this.inputForm.handledBy} ${this.formatDate(new Date())} 申请`
+        }
 
         // 监听事件
         uni.$on('eventName', (data) => {
@@ -491,24 +491,28 @@ export default {
                 procurementType: names,
                 procurementTypeId: ids[0],
                 tradeName: '',
-                supplierName: '',
-                supplierId: '',
-                isSupplier: '',
+                goodsName: '',
                 tradePrice: '',
                 tradeNumber: '',
                 priceSum: '',
                 company: '',
-                spec: '',
+                brand: '',
+                specification: '',
+                spec: '1',
                 surplusNumber: ''
             });
         },
         handleGoodsSelected({ index, item }) {
+            const tradeName = item.tradeName || item.name || ''
             this.$set(this.inputForm.detailInfos, index, {
                 ...this.inputForm.detailInfos[index],
-                tradeName: item.tradeName || '',
+                tradeName,
+                goodsName: tradeName,
+                brand: item.brand || '',
+                specification: item.specification || '',
                 company: item.company || this.inputForm.detailInfos[index].company || '',
-                spec: item.spec || '',
-                surplusNumber: item.tradeNumber || item.surplusNumber || ''
+                spec: '1',
+                surplusNumber: item.currentInventory || item.tradeNumber || item.surplusNumber || ''
             });
         },
         init(id) {
@@ -566,6 +570,9 @@ export default {
         buildTree(nodes, parentId = '0') {
             const tree = [];
             for (const node of nodes) {
+                if (String(node.infoType || node.info_type || '') === '1') {
+                    continue
+                }
                 if (node.parentId === parentId) {
                     const children = this.buildTree(nodes, node.id);
                     if (children.length) {
@@ -630,14 +637,14 @@ export default {
                 procurementType: '',
                 procurementTypeId: '',
                 tradeName: '',
-                supplierName: '',
-                supplierId: '',
-                isSupplier: '',
+                goodsName: '',
                 tradePrice: '',
                 tradeNumber: '',
                 priceSum: '',
                 company: '',
-                spec: '',
+                brand: '',
+                specification: '',
+                spec: '1',
                 surplusNumber: '',
                 remarks: '',
                 fileInfoLost: []
@@ -760,11 +767,9 @@ export default {
                         for (let k = j + 1; k < i; k++) {
                             if (this.inputForm.detailInfos[j].procurementType === this.inputForm.detailInfos[k].procurementType) { // 如果采购类型相同
                                 if (this.inputForm.detailInfos[j].tradeName === this.inputForm.detailInfos[k].tradeName) { // 如果商品名称相同
-                                    if (this.inputForm.detailInfos[j].supplierName === this.inputForm.detailInfos[k].supplierName) {
-                                        this.$message.warning(`采购详情中,同种采购类型、同一供应商的商品名称只能输入一条`)
-                                        this.loading = false
-                                        throw new Error('采购详情中,同种采购类型、同一供应商的商品名称只能输入一条')
-                                    }
+                                    this.$message.warning(`采购详情中,同种采购类型的商品名称只能输入一条`)
+                                    this.loading = false
+                                    throw new Error('采购详情中,同种采购类型的商品名称只能输入一条')
                                 }
                             }
                         }

+ 0 - 103
pages/psiManagement/purchase/SupplierSelector.vue

@@ -1,103 +0,0 @@
-<template>
-    <u-form-item label="供应商" :prop="'detailInfos[' + index_experience + '].supplierName'" :required="true">
-        <el-autocomplete
-                style="width: 100%;"
-                v-model="inputForm.detailInfos[index_experience].supplierName"
-                placeholder="请选择供应商"
-                clearable
-                @focus="showDropdown"
-                :fetch-suggestions="fetchSuggestions"
-                @select="handleSelect"
-                :disabled="disabled"
-        >
-            <template slot-scope="{ item }">
-                <span style="width: 100%;">{{ item.name }}</span>
-            </template>
-        </el-autocomplete>
-    </u-form-item>
-</template>
-
-<script>
-    import SupplierService from '@/api/psi/SupplierService'
-    export default {
-        props: {
-            index_experience: Number,
-            inputForm: Object,
-            disabled: Boolean // 接收传入的 disabled 属性
-        },
-        data() {
-            return {
-                showDropdownList: false,
-                selectedSupplier: null,
-                suppliers: [] // 供应商对象数组 [{id: 1, name: 'Supplier 1'}, ...]
-            };
-        },
-        supplierService: null,
-        created () {
-            this.supplierService = new SupplierService()
-            this.showDropdown()
-        },
-        methods: {
-
-            showDropdown() {
-                // 将获取的供应商赋值给 this.suppliers
-                this.supplierService.list({
-                    'current': 1,
-                    'size': -1,
-                }).then((data) => {
-                    this.suppliers = data.records
-                    this.showDropdownList = true;
-                })
-            },
-            isEmpty(value) {
-                let result = false;
-                if (value == null || value == undefined) {
-                    result = true;
-                }
-                if (typeof value == 'string' && (value.replace(/\s+/g, "") == "" || value == "")) {
-                    result = true;
-                }
-                if (typeof value == "object" && value instanceof Array && value.length === 0) {
-                    result = true;
-                }
-                return result;
-            },
-            isNotEmpty (value) {
-                return !this.isEmpty(value)
-            },
-            fetchSuggestions(queryString, callback) {
-
-                if (this.suppliers && queryString) {
-                    const filteredList = this.suppliers.filter(item =>
-                        item.name.toLowerCase().includes(queryString.toLowerCase())
-                    );
-                    callback(filteredList);
-                } else {
-                    callback(this.suppliers);
-                    // Handle the case when suppliers or queryString is not properly initialized
-                }
-            },
-            handleSelect(item) {
-                this.inputForm.detailInfos[this.index_experience].supplierName = item.name;
-                this.inputForm.detailInfos[this.index_experience].supplierId = item.id;
-                this.inputForm.detailInfos[this.index_experience].isSupplier = '2';
-                this.showDropdownList = false;
-            }
-        }
-    };
-</script>
-
-<style scoped>
-    .my-dropdown {
-        position: absolute;
-        top: calc(100% + 4px); /* 将下拉框定位在输入框的下方,此处增加了 4px 的间距 */
-        left: 0;
-        width: 100%;
-        background-color: #fff;
-        border: 1px solid #ccc;
-    }
-    .list-item {
-        padding: 8px;
-        cursor: pointer;
-    }
-</style>

+ 76 - 74
pages/psiManagement/wareHouse/WareHouseAddForm.vue

@@ -35,42 +35,47 @@
                 <view v-for="(item, index) in inputForm.detailInfos" :key="item.id || index" class="detail-card">
                     <view class="detail-card-title">采购明细 {{ index + 1 }}</view>
                     <view class="detail-grid">
-                        <view class="detail-item">
+     <!--                   <view class="detail-item">
                             <text class="detail-label">采购人</text>
                             <text class="detail-value">{{ item.purchaserAgent || '-' }}</text>
                         </view>
                         <view class="detail-item">
                             <text class="detail-label">采购部门</text>
                             <text class="detail-value">{{ item.procurementOffice || '-' }}</text>
-                        </view>
+                        </view> -->
                         <view class="detail-item">
-                            <text class="detail-label">采购类型</text>
+                            <text class="detail-label">商品名称</text>
                             <text class="detail-value">{{ item.procurementType || '-' }}</text>
                         </view>
+          <!--              <view class="detail-item">
+                            <text class="detail-label">商品名称</text>
+                            <text class="detail-value">{{ item.tradeName || '-' }}</text>
+                        </view> -->
                         <view class="detail-item">
-                            <text class="detail-label">供应商</text>
-                            <text class="detail-value">{{ item.supplierName || '-' }}</text>
+                            <text class="detail-label">品牌</text>
+                            <text class="detail-value">{{ item.brand || '-' }}</text>
                         </view>
                         <view class="detail-item">
-                            <text class="detail-label">商品名称</text>
-                            <text class="detail-value">{{ item.tradeName || '-' }}</text>
+                            <text class="detail-label">规格</text>
+                            <text class="detail-value">{{ item.specification || '-' }}</text>
                         </view>
+						<view class="detail-item">
+						    <text class="detail-label">单位</text>
+						    <text class="detail-value">{{ item.company || '-' }}</text>
+						</view>
                         <view class="detail-item">
-                            <text class="detail-label">商品数量</text>
+                            <text class="detail-label">采购数量</text>
                             <text class="detail-value">{{ item.tradeNumber || '-' }}</text>
                         </view>
-                        <view class="detail-item">
+                       <!-- <view class="detail-item">
                             <text class="detail-label">商品单价</text>
                             <text class="detail-value">{{ item.tradePrice || '-' }}</text>
                         </view>
                         <view class="detail-item">
                             <text class="detail-label">商品总价</text>
                             <text class="detail-value">{{ item.priceSum || '-' }}</text>
-                        </view>
-                        <view class="detail-item">
-                            <text class="detail-label">单位</text>
-                            <text class="detail-value">{{ item.company || '-' }}</text>
-                        </view>
+                        </view> -->
+
                         <view class="detail-item">
                             <text class="detail-label">备注</text>
                             <text class="detail-value">{{ item.remarks || '-' }}</text>
@@ -89,36 +94,36 @@
                     class="detail-card warehouse-card">
                     <view class="detail-card-title">入库明细 {{ index + 1 }}</view>
 
-                    <u-form-item label="入库人" :prop="'wareHouse[' + index + '].wareHouseMan'" :required="true">
+       <!--             <u-form-item label="入库人" :prop="'wareHouse[' + index + '].wareHouseMan'" :required="true">
                         <u--input v-model="inputForm.wareHouse[index].wareHouseMan" placeholder="请选择入库人"
                             :disabled="nodeFlag" @focus="openUserPullForm(index)" clearable></u--input>
                     </u-form-item>
                     <u-form-item label="入库部门" :prop="'wareHouse[' + index + '].wareHouseManOffice'">
                         <u--input v-model="inputForm.wareHouse[index].wareHouseManOffice" disabled></u--input>
-                    </u-form-item>
-                    <u-form-item label="入库类型" :prop="'wareHouse[' + index + '].wareHouseType'" :required="true">
-                        <u--input v-model="inputForm.wareHouse[index].wareHouseType" placeholder="请选择入库类型"
-                            :disabled="nodeFlag" @focus="openTypePicker(index)" clearable></u--input>
-                    </u-form-item>
-
+                    </u-form-item> -->
                     <ware-house-goods-selector :rowIndex="index" :inputForm="inputForm" :disabled="nodeFlag"
                         @selected="handleGoodsSelected"></ware-house-goods-selector>
-                    <ware-house-supplier-selector :rowIndex="index" :inputForm="inputForm" :disabled="nodeFlag"
-                        @selected="handleSupplierSelected"></ware-house-supplier-selector>
 
-                    <u-form-item label="商品数量" :prop="'wareHouse[' + index + '].tradeNumber'" :required="true">
+                    <u-form-item label="品牌" :prop="'wareHouse[' + index + '].brand'">
+                        <u--input v-model="inputForm.wareHouse[index].brand" disabled></u--input>
+                    </u-form-item>
+                    <u-form-item label="规格" :prop="'wareHouse[' + index + '].specification'">
+                        <u--input v-model="inputForm.wareHouse[index].specification" disabled></u--input>
+                    </u-form-item>
+					<u-form-item label="单位" :prop="'wareHouse[' + index + '].company'">
+					    <u--input v-model="inputForm.wareHouse[index].company" placeholder="请输入单位" disabled
+					        @blur="calculateWareHouseTotals"></u--input>
+					</u-form-item>
+                    <u-form-item label="入库数量" :prop="'wareHouse[' + index + '].tradeNumber'" :required="true">
                         <u--input v-model="inputForm.wareHouse[index].tradeNumber" placeholder="请输入商品数量"
                             :disabled="nodeFlag" @blur="onRowInputBlur(index, 'tradeNumber')"></u--input>
                     </u-form-item>
-                    <u-form-item label="单位" :prop="'wareHouse[' + index + '].company'">
-                        <u--input v-model="inputForm.wareHouse[index].company" placeholder="请输入单位" :disabled="nodeFlag"
-                            @blur="calculateWareHouseTotals"></u--input>
-                    </u-form-item>
-                    <u-form-item label="包装规格" :prop="'wareHouse[' + index + '].spec'" :required="true">
+
+                    <!-- <u-form-item label="包装规格" :prop="'wareHouse[' + index + '].spec'" :required="true">
                         <u--input v-model="inputForm.wareHouse[index].spec" placeholder="请输入包装规格" :disabled="nodeFlag"
                             @blur="onRowInputBlur(index, 'spec')"></u--input>
-                    </u-form-item>
-                    <u-form-item label="商品单价(元)" :prop="'wareHouse[' + index + '].tradePrice'">
+                    </u-form-item> -->
+                <!--    <u-form-item label="商品单价(元)" :prop="'wareHouse[' + index + '].tradePrice'">
                         <u--input v-model="inputForm.wareHouse[index].tradePrice" placeholder="请输入商品单价"
                             :disabled="nodeFlag" @blur="onRowInputBlur(index, 'tradePrice')"></u--input>
                     </u-form-item>
@@ -145,7 +150,7 @@
                     <u-form-item label="实际价格" :prop="'wareHouse[' + index + '].actualPrice'">
                         <u--input v-model="inputForm.wareHouse[index].actualPrice" placeholder="请输入实际价格"
                             :disabled="nodeFlag" @blur="onRowInputBlur(index, 'actualPrice')"></u--input>
-                    </u-form-item>
+                    </u-form-item> -->
                     <u-form-item label="备注" :prop="'wareHouse[' + index + '].remarks'">
                         <u--input v-model="inputForm.wareHouse[index].remarks" placeholder="请输入备注" :disabled="nodeFlag">
                         </u--input>
@@ -203,7 +208,6 @@ import MaterialManagementService from '@/api/psi/MaterialManagementService'
 import WareHouseService from '@/api/psi/WareHouseService'
 import PurchaseSelector from './PurchaseSelector.vue'
 import WareHouseGoodsSelector from './WareHouseGoodsSelector.vue'
-import WareHouseSupplierSelector from './WareHouseSupplierSelector.vue'
 
 export default {
     name: 'PsiWareHouseAddForm',
@@ -212,8 +216,7 @@ export default {
         baTreePicker,
         UploadComponent,
         PurchaseSelector,
-        WareHouseGoodsSelector,
-        WareHouseSupplierSelector
+        WareHouseGoodsSelector
     },
     computed: mapState({
         userInfo: (state) => state.user.userInfo
@@ -308,7 +311,7 @@ export default {
                 wareHouseName: '',
                 wareHouseNumber: '',
                 userId: '',
-                wareHouseDate: '',
+                wareHouseDate: this.formatDate(new Date()),
                 remarks: '',
                 detailInfos: [],
                 wareHouse: [],
@@ -347,6 +350,18 @@ export default {
             this.inputForm.userId = this.inputForm.userId || this.userInfo.id || this.userInfo.userId || ''
             this.inputForm.handledByOffice = this.inputForm.handledByOffice || office.id || this.userInfo.officeId || ''
             this.inputForm.handledByOfficeName = this.inputForm.handledByOfficeName || office.name || this.userInfo.officeName || ''
+            this.applyDefaultWareHouseName()
+        },
+        applyDefaultWareHouseName() {
+            if (this.isNotEmpty(this.inputForm.wareHouseName)) {
+                return
+            }
+            const handledBy = this.inputForm.handledBy || ''
+            const wareHouseDate = this.formatDate(this.inputForm.wareHouseDate || new Date())
+            if (this.isEmpty(handledBy) || this.isEmpty(wareHouseDate)) {
+                return
+            }
+            this.inputForm.wareHouseName = `${handledBy} ${wareHouseDate} 入库`
         },
         resetForm() {
             this.inputForm = this.createInputForm()
@@ -385,6 +400,9 @@ export default {
         buildTree(nodes, parentId = '0') {
             const tree = []
             for (const node of nodes || []) {
+                if (String(node.infoType || node.info_type || '') === '1') {
+                    continue
+                }
                 if (node.parentId === parentId) {
                     const treeNode = {
                         ...node
@@ -468,14 +486,13 @@ export default {
                 wareHouseType: names,
                 wareHouseTypeId: ids[0],
                 tradeName: '',
-                supplierName: '',
-                supplierId: '',
-                isSupplier: '',
                 tradePrice: '',
                 tradeNumber: '',
                 priceSum: '',
                 company: '',
-                spec: '',
+                brand: '',
+                specification: '',
+                spec: '1',
                 actualPrice: '',
                 surplusNumber: ''
             })
@@ -495,15 +512,16 @@ export default {
             }
         },
         handleGoodsSelected({ index, item }) {
+            const tradeName = item.tradeName || item.name || ''
             this.patchWareHouseRow(index, {
-                tradeName: item.tradeName || ''
-            })
-        },
-        handleSupplierSelected({ index, item }) {
-            this.patchWareHouseRow(index, {
-                supplierName: item.name || '',
-                supplierId: item.id || '',
-                isSupplier: '2'
+                wareHouseType: tradeName,
+                wareHouseTypeId: item.id || '',
+                tradeName,
+                goodsName: tradeName,
+                brand: item.brand || '',
+                specification: item.specification || '',
+                company: item.company || '',
+                spec: '1'
             })
         },
         createWareHouseRow(row = {}) {
@@ -517,12 +535,11 @@ export default {
                 wareHouseType: '',
                 wareHouseTypeId: '',
                 tradeName: '',
-                supplierName: '',
-                supplierId: '',
-                isSupplier: '',
                 tradeNumber: '',
                 company: '',
-                spec: '',
+                brand: '',
+                specification: '',
+                spec: '1',
                 tradePrice: '',
                 priceSum: '',
                 produceDate: '',
@@ -550,20 +567,14 @@ export default {
                 tradeNumber: detail.tradeNumber || '',
                 tradePrice: detail.tradePrice || '',
                 company: detail.company || '',
+                brand: detail.brand || '',
+                specification: detail.specification || '',
                 priceSum: this.computePriceSum(detail.tradePrice, detail.tradeNumber),
-                supplierId: '',
-                supplierName: '',
-                isSupplier: '',
-                spec: '',
+                spec: '1',
                 produceDate: '',
                 shelfLife: '',
                 shelfLifeUnit: '月'
             }
-            if (this.isNotEmpty(detail.supplierId) && this.isNotEmpty(detail.isSupplier) && detail.isSupplier === '2') {
-                row.supplierId = detail.supplierId
-                row.supplierName = detail.supplierName
-                row.isSupplier = detail.isSupplier
-            }
             this.addWareHouseRow(row)
         },
         patchWareHouseRow(index, patch) {
@@ -697,16 +708,8 @@ export default {
                     this.$message.error(`入库详情第${lineNo}行请选择入库人`)
                     return false
                 }
-                if (this.isEmpty(row.wareHouseType)) {
-                    this.$message.error(`入库详情第${lineNo}行请选择入库类型`)
-                    return false
-                }
-                if (this.isEmpty(row.supplierName) || this.isEmpty(row.supplierId)) {
-                    this.$message.error(`入库详情第${lineNo}行请选择供应商`)
-                    return false
-                }
-                if (this.isEmpty(row.tradeName)) {
-                    this.$message.error(`入库详情第${lineNo}行请填写商品名称`)
+                if (this.isEmpty(row.wareHouseTypeId) || this.isEmpty(row.tradeName)) {
+                    this.$message.error(`入库详情第${lineNo}行请选择物品名称`)
                     return false
                 }
                 if (this.isEmpty(row.tradeNumber)) {
@@ -721,9 +724,8 @@ export default {
             for (let i = 0; i < rows.length; i++) {
                 for (let j = i + 1; j < rows.length; j++) {
                     if (rows[i].wareHouseTypeId === rows[j].wareHouseTypeId &&
-                        rows[i].tradeName === rows[j].tradeName &&
-                        rows[i].supplierId === rows[j].supplierId) {
-                        this.$message.warning('入库详情中,同种入库类型、同一供应商的商品名称只能输入一条')
+                        rows[i].tradeName === rows[j].tradeName) {
+                        this.$message.warning('入库详情中,同一物品只能输入一条')
                         return false
                     }
                 }

+ 32 - 54
pages/psiManagement/wareHouse/WareHouseGoodsSelector.vue

@@ -1,32 +1,34 @@
 <template>
     <view>
-        <u-form-item label="商品名称" :prop="'wareHouse[' + rowIndex + '].tradeName'" :required="true">
-            <view class="goods-input-wrap">
-                <u--input class="goods-input" :value="currentValue" placeholder="请输入或选择商品名称" :disabled="disabled"
-                    @input="handleManualInput"></u--input>
-                <el-button class="goods-select-btn" type="primary" plain :disabled="disabled" @click="openPicker">
-                    选择
-                </el-button>
-            </view>
+        <u-form-item label="物品名称" :prop="'wareHouse[' + rowIndex + '].tradeName'" :required="true">
+            <u--input :value="currentValue" placeholder="请选择物品名称" :disabled="disabled" @focus="openPicker"></u--input>
         </u-form-item>
 
         <view class="selector-mask" :class="{ show: visible }" @tap="closePicker"></view>
         <view class="selector-panel" :class="{ show: visible }">
             <view class="selector-header">
                 <view class="selector-action" @tap="closePicker">取消</view>
-                <view class="selector-title">选择品</view>
+                <view class="selector-title">选择品</view>
                 <view class="selector-action selector-action-placeholder">取消</view>
             </view>
             <view class="selector-search">
-                <u-search :show-action="false" v-model="keyword" placeholder="搜索品名称"></u-search>
+                <u-search :show-action="false" v-model="keyword" placeholder="搜索品名称"></u-search>
             </view>
             <scroll-view scroll-y class="selector-list">
                 <view v-if="loading" class="selector-state">加载中...</view>
-                <view v-else-if="filteredList.length === 0" class="selector-state">暂无可选品</view>
+                <view v-else-if="filteredList.length === 0" class="selector-state">暂无可选品</view>
                 <view v-else class="selector-list-inner">
                     <view class="selector-card" v-for="item in filteredList" :key="item.id || item.tradeName"
                         @tap="selectItem(item)">
-                        <view class="selector-name">{{ item.tradeName }}</view>
+                        <view class="selector-name">{{ item.tradeName || '-' }}</view>
+                        <view class="selector-meta">
+                            <text>库存:{{ item.currentInventory || item.surplusNumber || '0' }}</text>
+                            <text v-if="item.company">单位:{{ item.company }}</text>
+                        </view>
+                        <view class="selector-meta" v-if="item.brand || item.specification">
+                            <text v-if="item.brand">品牌:{{ item.brand }}</text>
+                            <text v-if="item.specification">规格:{{ item.specification }}</text>
+                        </view>
                     </view>
                 </view>
             </scroll-view>
@@ -35,7 +37,7 @@
 </template>
 
 <script>
-import WareHouseService from '@/api/psi/WareHouseService'
+import MaterialTypeService from '@/api/psi/MaterialTypeService'
 
 export default {
     name: 'WareHouseGoodsSelector',
@@ -50,7 +52,7 @@ export default {
             loading: false,
             keyword: '',
             goodsList: [],
-            wareHouseService: null
+            materialTypeService: null
         }
     },
     computed: {
@@ -58,7 +60,7 @@ export default {
             return (this.inputForm.wareHouse || [])[this.rowIndex] || {}
         },
         currentValue() {
-            return this.currentRow.tradeName || ''
+            return this.currentRow.wareHouseType || this.currentRow.tradeName || ''
         },
         filteredList() {
             const keyword = (this.keyword || '').trim().toLowerCase()
@@ -69,7 +71,7 @@ export default {
         }
     },
     created() {
-        this.wareHouseService = new WareHouseService()
+        this.materialTypeService = new MaterialTypeService()
     },
     methods: {
         isEmpty(value) {
@@ -84,28 +86,10 @@ export default {
             }
             return false
         },
-        handleManualInput(value) {
-            if (this.disabled) {
-                return
-            }
-            const rows = (this.inputForm && this.inputForm.wareHouse) || []
-            const row = rows[this.rowIndex]
-            if (!row) {
-                return
-            }
-            this.$set(row, 'tradeName', value)
-        },
         async openPicker() {
             if (this.disabled) {
                 return
             }
-            if (this.isEmpty(this.currentRow.wareHouseTypeId)) {
-                uni.showToast({
-                    title: '请先选择入库类型',
-                    icon: 'none'
-                })
-                return
-            }
             this.visible = true
             this.keyword = ''
             await this.loadGoodsList()
@@ -116,10 +100,12 @@ export default {
         async loadGoodsList() {
             this.loading = true
             try {
-                const data = await this.wareHouseService.findTradeByTypeId(this.currentRow.wareHouseTypeId)
-                this.goodsList = (data || []).map(item => ({
+                const data = await this.materialTypeService.cgList()
+                this.goodsList = (data || []).filter(item => {
+                    return String(item.infoType || item.info_type || '') === '1'
+                }).map(item => ({
                     ...item,
-                    tradeName: item.tradeName || ''
+                    tradeName: item.tradeName || item.name || ''
                 }))
             } catch (e) {
                 this.goodsList = []
@@ -143,23 +129,6 @@ export default {
 </script>
 
 <style scoped>
-.goods-input-wrap {
-    display: flex;
-    align-items: center;
-    width: 100%;
-    gap: 16rpx;
-}
-
-.goods-input {
-    flex: 1;
-    min-width: 0;
-}
-
-.goods-select-btn {
-    flex: 0 0 132rpx;
-    width: 132rpx;
-}
-
 .selector-mask {
     position: fixed;
     inset: 0;
@@ -254,4 +223,13 @@ export default {
     font-weight: 600;
     color: #0f172a;
 }
+
+.selector-meta {
+    display: flex;
+    gap: 16rpx;
+    margin-top: 10rpx;
+    font-size: 24rpx;
+    color: #64748b;
+    flex-wrap: wrap;
+}
 </style>

+ 2 - 26
pages/psiManagement/wareHouse/WareHouseList.vue

@@ -12,10 +12,6 @@
                     <text class="filter-label">入库名称</text>
                     <u--input v-model="searchForm.wareHouseName" placeholder="请输入入库名称" clearable></u--input>
                 </view>
-                <view class="filter-field" @tap="openSupplierPicker">
-                    <text class="filter-label">供应商</text>
-                    <text class="filter-value">{{ searchForm.supplierName || '全部' }}</text>
-                </view>
                 <view class="filter-field">
                     <text class="filter-label">状态</text>
                     <jp-picker placeholder="全部" v-model="searchForm.status" rangeKey="label" rangeValue="value"
@@ -85,8 +81,6 @@
             <text v-else @tap="loadMore">加载更多</text>
         </view>
 
-        <ware-house-supplier-picker ref="supplierPicker" @selected="selectSupplier" @clear="clearSupplier">
-        </ware-house-supplier-picker>
     </view>
 </template>
 
@@ -96,15 +90,12 @@ import WareHouseService from '@/api/psi/WareHouseService'
 import processService from '@/api/flowable/processService'
 import taskService from '@/api/flowable/taskService'
 import userService from '@/api/sys/userService'
-import WareHouseSupplierPicker from '../wareHouseSummary/WareHouseSupplierPicker.vue'
 
 const BUSINESS_TABLE = 'psi_management_warehouse_basics'
 
 export default {
     name: 'WareHouseList',
-    components: {
-        WareHouseSupplierPicker
-    },
+    components: {},
     computed: mapState({
         userInfo: (state) => state.user.userInfo
     }),
@@ -165,9 +156,7 @@ export default {
                 handledByOffice: '',
                 wareHouseDates: [],
                 procurementType: '',
-                createBy: '',
-                supplierId: '',
-                supplierName: ''
+                createBy: ''
             }
         },
         async loadProcessDefinition() {
@@ -241,19 +230,6 @@ export default {
             this.searchForm = this.createSearchForm()
             this.refreshList()
         },
-        openSupplierPicker() {
-            this.$refs.supplierPicker.open()
-        },
-        selectSupplier(item) {
-            this.searchForm.supplierId = item.id || ''
-            this.searchForm.supplierName = item.name || ''
-            this.refreshList()
-        },
-        clearSupplier() {
-            this.searchForm.supplierId = ''
-            this.searchForm.supplierName = ''
-            this.refreshList()
-        },
         viewDetail(row) {
             uni.navigateTo({
                 url: `/pages/psiManagement/wareHouse/WareHouseUpdateForm?id=${row.id}&method=view&readOnly=true`

+ 0 - 241
pages/psiManagement/wareHouse/WareHouseSupplierSelector.vue

@@ -1,241 +0,0 @@
-<template>
-    <view>
-        <u-form-item label="供应商" :prop="'wareHouse[' + rowIndex + '].supplierName'" :required="true">
-            <view class="supplier-input-wrap" @tap.stop="openPicker">
-                <u--input class="supplier-input" :value="currentValue" placeholder="请选择供应商" readonly
-                    :disabled="disabled" @focus="openPicker" @click="openPicker" @tap="openPicker"></u--input>
-                <el-button class="supplier-select-btn" type="primary" plain :disabled="disabled" @click="openPicker">
-                    选择
-                </el-button>
-            </view>
-        </u-form-item>
-
-        <view class="selector-mask" :class="{ show: visible }" @tap="closePicker"></view>
-        <view class="selector-panel" :class="{ show: visible }">
-            <view class="selector-header">
-                <view class="selector-action" @tap="closePicker">取消</view>
-                <view class="selector-title">选择供应商</view>
-                <view class="selector-action selector-action-placeholder">取消</view>
-            </view>
-            <view class="selector-search">
-                <u-search :show-action="false" v-model="keyword" placeholder="搜索供应商名称"></u-search>
-            </view>
-            <scroll-view scroll-y class="selector-list">
-                <view v-if="loading" class="selector-state">加载中...</view>
-                <view v-else-if="filteredList.length === 0" class="selector-state">暂无可选供应商</view>
-                <view v-else class="selector-list-inner">
-                    <view class="selector-card" v-for="item in filteredList" :key="item.id" @tap="selectItem(item)">
-                        <view class="selector-name">{{ item.name }}</view>
-                        <view class="selector-meta">
-                            <text v-if="item.address">地址:{{ item.address }}</text>
-                            <text v-if="item.telPhone">联系电话:{{ item.telPhone }}</text>
-                        </view>
-                    </view>
-                </view>
-            </scroll-view>
-        </view>
-    </view>
-</template>
-
-<script>
-import SupplierService from '@/api/psi/SupplierService'
-
-export default {
-    name: 'WareHouseSupplierSelector',
-    props: {
-        rowIndex: Number,
-        inputForm: Object,
-        disabled: Boolean
-    },
-    data() {
-        return {
-            visible: false,
-            loading: false,
-            keyword: '',
-            suppliers: [],
-            supplierService: null
-        }
-    },
-    computed: {
-        currentRow() {
-            return (this.inputForm.wareHouse || [])[this.rowIndex] || {}
-        },
-        currentValue() {
-            return this.currentRow.supplierName || ''
-        },
-        filteredList() {
-            const keyword = (this.keyword || '').trim().toLowerCase()
-            if (!keyword) {
-                return this.suppliers
-            }
-            return this.suppliers.filter(item => (item.name || '').toLowerCase().includes(keyword))
-        }
-    },
-    created() {
-        this.supplierService = new SupplierService()
-    },
-    methods: {
-        async openPicker() {
-            if (this.disabled) {
-                return
-            }
-            this.visible = true
-            this.keyword = ''
-            if (!this.suppliers.length) {
-                await this.loadSuppliers()
-            }
-        },
-        closePicker() {
-            this.visible = false
-        },
-        async loadSuppliers() {
-            this.loading = true
-            try {
-                const data = await this.supplierService.list({
-                    current: 1,
-                    size: -1
-                })
-                this.suppliers = (data && data.records) || []
-            } catch (e) {
-                this.suppliers = []
-                uni.showToast({
-                    title: '供应商数据加载失败',
-                    icon: 'none'
-                })
-            } finally {
-                this.loading = false
-            }
-        },
-        selectItem(item) {
-            this.$emit('selected', {
-                index: this.rowIndex,
-                item
-            })
-            this.closePicker()
-        }
-    }
-}
-</script>
-
-<style scoped>
-.supplier-input-wrap {
-    display: flex;
-    align-items: center;
-    width: 100%;
-    gap: 16rpx;
-}
-
-.supplier-input {
-    flex: 1;
-    min-width: 0;
-}
-
-.supplier-select-btn {
-    flex: 0 0 132rpx;
-    width: 132rpx;
-}
-
-.selector-mask {
-    position: fixed;
-    inset: 0;
-    background: rgba(0, 0, 0, 0.35);
-    opacity: 0;
-    visibility: hidden;
-    transition: all 0.25s ease;
-    z-index: 1000;
-}
-
-.selector-mask.show {
-    opacity: 1;
-    visibility: visible;
-}
-
-.selector-panel {
-    position: fixed;
-    left: 0;
-    right: 0;
-    bottom: 0;
-    height: 68vh;
-    background: #f7f9fc;
-    border-radius: 28rpx 28rpx 0 0;
-    transform: translateY(100%);
-    transition: transform 0.25s ease;
-    z-index: 1001;
-    display: flex;
-    flex-direction: column;
-}
-
-.selector-panel.show {
-    transform: translateY(0);
-}
-
-.selector-header {
-    display: flex;
-    align-items: center;
-    justify-content: space-between;
-    padding: 28rpx 32rpx 16rpx;
-    background: #fff;
-    border-bottom: 1rpx solid #eef2f7;
-}
-
-.selector-title {
-    font-size: 32rpx;
-    font-weight: 600;
-    color: #1f2937;
-}
-
-.selector-action {
-    min-width: 80rpx;
-    font-size: 28rpx;
-    color: #2979ff;
-}
-
-.selector-action-placeholder {
-    opacity: 0;
-}
-
-.selector-search {
-    padding: 20rpx 24rpx 8rpx;
-    background: #fff;
-}
-
-.selector-list {
-    flex: 1;
-    padding: 16rpx 24rpx 32rpx;
-}
-
-.selector-list-inner {
-    display: flex;
-    flex-direction: column;
-    gap: 16rpx;
-}
-
-.selector-state {
-    padding-top: 120rpx;
-    text-align: center;
-    font-size: 28rpx;
-    color: #94a3b8;
-}
-
-.selector-card {
-    background: #fff;
-    border-radius: 20rpx;
-    padding: 24rpx;
-    box-shadow: 0 8rpx 24rpx rgba(15, 23, 42, 0.06);
-}
-
-.selector-name {
-    font-size: 30rpx;
-    font-weight: 600;
-    color: #0f172a;
-}
-
-.selector-meta {
-    display: flex;
-    flex-direction: column;
-    gap: 8rpx;
-    margin-top: 12rpx;
-    font-size: 24rpx;
-    color: #64748b;
-}
-</style>

+ 56 - 54
pages/psiManagement/wareHouse/WareHouseUpdateForm.vue

@@ -37,38 +37,46 @@
                 <view v-for="(item, index) in inputForm.detailInfos" :key="item.id || index" class="detail-card">
                     <view class="detail-card-title">采购明细 {{ index + 1 }}</view>
                     <view class="detail-grid">
-                        <view class="detail-item">
+                     <!--   <view class="detail-item">
                             <text class="detail-label">采购人</text>
                             <text class="detail-value">{{ item.purchaserAgent || '-' }}</text>
                         </view>
                         <view class="detail-item">
                             <text class="detail-label">采购部门</text>
                             <text class="detail-value">{{ item.procurementOffice || '-' }}</text>
-                        </view>
+                        </view> -->
                         <view class="detail-item">
-                            <text class="detail-label">采购类型</text>
+                            <text class="detail-label">商品名称</text>
                             <text class="detail-value">{{ item.procurementType || '-' }}</text>
                         </view>
-                        <view class="detail-item">
+        <!--                <view class="detail-item">
                             <text class="detail-label">商品名称</text>
                             <text class="detail-value">{{ item.tradeName || '-' }}</text>
+                        </view> -->
+                        <view class="detail-item">
+                            <text class="detail-label">品牌</text>
+                            <text class="detail-value">{{ item.brand || '-' }}</text>
                         </view>
                         <view class="detail-item">
-                            <text class="detail-label">供应商</text>
-                            <text class="detail-value">{{ item.supplierName || '-' }}</text>
+                            <text class="detail-label">规格</text>
+                            <text class="detail-value">{{ item.specification || '-' }}</text>
                         </view>
+						<view class="detail-item">
+						    <text class="detail-label">单位</text>
+						    <text class="detail-value">{{ item.company || '-' }}</text>
+						</view>
                         <view class="detail-item">
                             <text class="detail-label">商品数量</text>
                             <text class="detail-value">{{ item.tradeNumber || '-' }}</text>
                         </view>
-                        <view class="detail-item">
+                     <!--   <view class="detail-item">
                             <text class="detail-label">商品单价</text>
                             <text class="detail-value">{{ item.tradePrice || '-' }}</text>
                         </view>
                         <view class="detail-item">
                             <text class="detail-label">商品总价</text>
                             <text class="detail-value">{{ item.priceSum || '-' }}</text>
-                        </view>
+                        </view> -->
                     </view>
                 </view>
             </view>
@@ -80,36 +88,36 @@
                         <view class="detail-card-title">入库明细 {{ index + 1 }}</view>
                     </view>
 
-                    <u-form-item label="入库人" :prop="'wareHouse[' + index + '].wareHouseMan'" :required="true">
+                  <!-- <u-form-item label="入库人" :prop="'wareHouse[' + index + '].wareHouseMan'" :required="true">
                         <u--input v-model="inputForm.wareHouse[index].wareHouseMan" placeholder="请选择入库人"
                             :disabled="nodeFlag" @focus="openUserPullForm(index)" clearable></u--input>
                     </u-form-item>
                     <u-form-item label="入库部门" :prop="'wareHouse[' + index + '].wareHouseManOffice'">
                         <u--input v-model="inputForm.wareHouse[index].wareHouseManOffice" disabled></u--input>
-                    </u-form-item>
-                    <u-form-item label="入库类型" :prop="'wareHouse[' + index + '].wareHouseType'" :required="true">
-                        <u--input v-model="inputForm.wareHouse[index].wareHouseType" placeholder="请选择入库类型"
-                            :disabled="nodeFlag" @focus="openTypePicker(index)" clearable></u--input>
-                    </u-form-item>
-
+                    </u-form-item> -->
                     <ware-house-goods-selector :rowIndex="index" :inputForm="inputForm" :disabled="nodeFlag"
                         @selected="handleGoodsSelected"></ware-house-goods-selector>
-                    <ware-house-supplier-selector :rowIndex="index" :inputForm="inputForm" :disabled="nodeFlag"
-                        @selected="handleSupplierSelected"></ware-house-supplier-selector>
 
+                    <u-form-item label="品牌" :prop="'wareHouse[' + index + '].brand'">
+                        <u--input v-model="inputForm.wareHouse[index].brand" disabled></u--input>
+                    </u-form-item>
+                    <u-form-item label="规格" :prop="'wareHouse[' + index + '].specification'">
+                        <u--input v-model="inputForm.wareHouse[index].specification" disabled></u--input>
+                    </u-form-item>
+					<u-form-item label="单位" :prop="'wareHouse[' + index + '].company'">
+					    <u--input v-model="inputForm.wareHouse[index].company" placeholder="请输入单位" disabled
+					        @blur="markWareHouseModified(index)"></u--input>
+					</u-form-item>
                     <u-form-item label="商品数量" :prop="'wareHouse[' + index + '].tradeNumber'" :required="true">
                         <u--input v-model="inputForm.wareHouse[index].tradeNumber" placeholder="请输入商品数量"
                             :disabled="nodeFlag" @blur="onRowInputBlur(index, 'tradeNumber')"></u--input>
                     </u-form-item>
-                    <u-form-item label="单位" :prop="'wareHouse[' + index + '].company'">
-                        <u--input v-model="inputForm.wareHouse[index].company" placeholder="请输入单位" :disabled="nodeFlag"
-                            @blur="markWareHouseModified(index)"></u--input>
-                    </u-form-item>
-                    <u-form-item label="包装规格" :prop="'wareHouse[' + index + '].spec'">
+
+                    <!-- <u-form-item label="包装规格" :prop="'wareHouse[' + index + '].spec'">
                         <u--input v-model="inputForm.wareHouse[index].spec" placeholder="请输入包装规格" :disabled="nodeFlag"
                             @blur="onRowInputBlur(index, 'spec')"></u--input>
-                    </u-form-item>
-                    <u-form-item label="商品单价(元)" :prop="'wareHouse[' + index + '].tradePrice'">
+                    </u-form-item> -->
+                   <!-- <u-form-item label="商品单价(元)" :prop="'wareHouse[' + index + '].tradePrice'">
                         <u--input v-model="inputForm.wareHouse[index].tradePrice" placeholder="请输入商品单价"
                             :disabled="nodeFlag" @blur="onRowInputBlur(index, 'tradePrice')"></u--input>
                     </u-form-item>
@@ -136,7 +144,7 @@
                     <u-form-item label="实际价格" :prop="'wareHouse[' + index + '].actualPrice'">
                         <u--input v-model="inputForm.wareHouse[index].actualPrice" placeholder="请输入实际价格"
                             :disabled="nodeFlag" @blur="onRowInputBlur(index, 'actualPrice')"></u--input>
-                    </u-form-item>
+                    </u-form-item> -->
                     <u-form-item label="备注" :prop="'wareHouse[' + index + '].remarks'">
                         <u--input v-model="inputForm.wareHouse[index].remarks" placeholder="请输入备注" :disabled="nodeFlag"
                             @blur="markWareHouseModified(index)"></u--input>
@@ -196,7 +204,6 @@ import WareHouseService from '@/api/psi/WareHouseService'
 import CommonApi from '@/api/common/CommonApi'
 import PurchaseSelector from './PurchaseSelector.vue'
 import WareHouseGoodsSelector from './WareHouseGoodsSelector.vue'
-import WareHouseSupplierSelector from './WareHouseSupplierSelector.vue'
 
 export default {
     name: 'PsiWareHouseUpdateForm',
@@ -205,8 +212,7 @@ export default {
         baTreePicker,
         UploadComponent,
         PurchaseSelector,
-        WareHouseGoodsSelector,
-        WareHouseSupplierSelector
+        WareHouseGoodsSelector
     },
     computed: mapState({
         userInfo: (state) => state.user.userInfo
@@ -431,6 +437,9 @@ export default {
         buildTree(nodes, parentId = '0') {
             const tree = []
             for (const node of nodes || []) {
+                if (String(node.infoType || node.info_type || '') === '1') {
+                    continue
+                }
                 if (node.parentId === parentId) {
                     const children = this.buildTree(nodes, node.id)
                     if (children.length) {
@@ -511,11 +520,10 @@ export default {
                 'wareHouseTypeId',
                 'wareHouseType',
                 'tradeName',
-                'supplierId',
-                'supplierName',
-                'isSupplier',
                 'tradeNumber',
                 'company',
+                'brand',
+                'specification',
                 'spec',
                 'tradePrice',
                 'actualPrice',
@@ -580,14 +588,13 @@ export default {
                 wareHouseType: names,
                 wareHouseTypeId: ids[0],
                 tradeName: '',
-                supplierName: '',
-                supplierId: '',
-                isSupplier: '',
                 tradePrice: '',
                 tradeNumber: '',
                 priceSum: '',
                 company: '',
-                spec: '',
+                brand: '',
+                specification: '',
+                spec: '1',
                 actualPrice: '',
                 surplusNumber: ''
             })
@@ -615,15 +622,16 @@ export default {
             }
         },
         handleGoodsSelected({ index, item }) {
+            const tradeName = item.tradeName || item.name || ''
             this.patchWareHouseRow(index, {
-                tradeName: item.tradeName || ''
-            })
-        },
-        handleSupplierSelected({ index, item }) {
-            this.patchWareHouseRow(index, {
-                supplierName: item.name || '',
-                supplierId: item.id || '',
-                isSupplier: '2'
+                wareHouseType: tradeName,
+                wareHouseTypeId: item.id || '',
+                tradeName,
+                goodsName: tradeName,
+                brand: item.brand || '',
+                specification: item.specification || '',
+                company: item.company || '',
+                spec: '1'
             })
         },
         createWareHouseRow() {
@@ -636,12 +644,11 @@ export default {
                 wareHouseType: '',
                 wareHouseTypeId: '',
                 tradeName: '',
-                supplierName: '',
-                supplierId: '',
-                isSupplier: '',
                 tradeNumber: '',
                 company: '',
-                spec: '',
+                brand: '',
+                specification: '',
+                spec: '1',
                 tradePrice: '',
                 priceSum: '',
                 produceDate: '',
@@ -819,10 +826,6 @@ export default {
                     this.$message.error(`入库详情第${lineNo}行请选择入库类型`)
                     return false
                 }
-                if (this.isEmpty(row.supplierName) || this.isEmpty(row.supplierId)) {
-                    this.$message.error(`入库详情第${lineNo}行请选择供应商`)
-                    return false
-                }
                 if (this.isEmpty(row.tradeName)) {
                     this.$message.error(`入库详情第${lineNo}行请填写商品名称`)
                     return false
@@ -835,9 +838,8 @@ export default {
             for (let i = 0; i < rows.length; i++) {
                 for (let j = i + 1; j < rows.length; j++) {
                     if (rows[i].wareHouseTypeId === rows[j].wareHouseTypeId &&
-                        rows[i].tradeName === rows[j].tradeName &&
-                        rows[i].supplierId === rows[j].supplierId) {
-                        this.$message.warning('入库详情中,同种入库类型、同一供应商的商品名称只能输入一条')
+                        rows[i].tradeName === rows[j].tradeName) {
+                        this.$message.warning('入库详情中,同种入库类型的商品名称只能输入一条')
                         return false
                     }
                 }

+ 2 - 5
pages/psiManagement/wareHouseSummary/WareHouseHistoryPanel.vue

@@ -95,7 +95,7 @@ export default {
         this.lossService = new LossService()
     },
     methods: {
-        async open(row, supplierId) {
+        async open(row) {
             this.tradeName = (row && row.tradeName) || ''
             this.activeTab = 'wareHouse'
             this.visible = true
@@ -107,10 +107,7 @@ export default {
                     tradeName: this.tradeName
                 }
                 const [wareData, collectData, lossData] = await Promise.all([
-                    this.wareHouseService.wareHouseHistoryList({
-                        ...params,
-                        detailId: supplierId ? row.id || '' : ''
-                    }),
+                    this.wareHouseService.wareHouseHistoryList(params),
                     this.wareHouseService.collectHistoryList(params),
                     this.lossService.getLossByTradeName({
                         current: 1,

+ 64 - 39
pages/psiManagement/wareHouseSummary/WareHouseSummaryList.vue

@@ -7,12 +7,6 @@
         <view class="search-panel">
             <u-search :show-action="false" v-model="searchForm.tradeName" placeholder="搜索商品名称" @search="refreshList"
                 @clear="refreshList"></u-search>
-            <view class="filter-row">
-                <view class="filter-item" @tap="openSupplierPicker">
-                    <text class="filter-label">供应商</text>
-                    <text class="filter-value">{{ searchForm.supplierName || '全部' }}</text>
-                </view>
-            </view>
             <view class="action-row">
                 <el-button class="action-button" type="primary" @click="refreshList">查询</el-button>
                 <el-button class="action-button" plain @click="resetSearch">重置</el-button>
@@ -35,47 +29,67 @@
                         <span class="text-strong">{{ scope.row.tradeName || '-' }}</span>
                     </template>
                 </el-table-column>
-                <el-table-column label="总量" width="90" align="center">
+                <el-table-column prop="brand" label="品牌" width="100" align="center">
+                    <template slot-scope="scope">{{ scope.row.brand || '-' }}</template>
+                </el-table-column>
+                <el-table-column prop="specification" label="规格" width="110" align="center">
+                    <template slot-scope="scope">{{ scope.row.specification || '-' }}</template>
+                </el-table-column>
+                <el-table-column prop="company" label="单位" width="80" align="center">
+                    <template slot-scope="scope">{{ scope.row.company || '-' }}</template>
+                </el-table-column>
+                <el-table-column prop="tradeNumber" label="实时库存量" width="110" align="center">
+                    <template slot-scope="scope">
+                        <span class="text-surplus">{{ formatNumber(scope.row.tradeNumber) }}</span>
+                    </template>
+                </el-table-column>
+                <el-table-column prop="allNumber" label="累计入库量" width="110" align="center">
                     <template slot-scope="scope">{{ formatNumber(scope.row.allNumber) }}</template>
                 </el-table-column>
-                <el-table-column label="领用量" width="90" align="center">
+                <el-table-column prop="borrowNumber" label="累计领用量" width="110" align="center">
                     <template slot-scope="scope">{{ calcBorrowNumber(scope.row) }}</template>
                 </el-table-column>
-                <el-table-column label="报损量" width="90" align="center">
+                <el-table-column prop="lossNumber" label="累计报损量" width="110" align="center">
                     <template slot-scope="scope">{{ calcLossNumber(scope.row) }}</template>
                 </el-table-column>
-                <el-table-column label="剩余量" width="90" align="center">
+                <el-table-column prop="warnNum" label="库存提醒数量" width="130" align="center">
                     <template slot-scope="scope">
-                        <span class="text-surplus">{{ formatNumber(scope.row.tradeNumber) }}</span>
+                        <el-input v-model="scope.row.warnNum" size="mini" @blur="changeWarnNum(scope.row)"></el-input>
                     </template>
                 </el-table-column>
-                <el-table-column prop="company" label="单位" width="80" align="center">
-                    <template slot-scope="scope">{{ scope.row.company || '-' }}</template>
+                <el-table-column prop="warnFlag" label="是否开启库存提醒" width="150" align="center">
+                    <template slot-scope="scope">
+                        <el-switch :value="scope.row.warnFlag === '1'" active-color="#13ce66" inactive-color="#ff4949"
+                            @change="updateWarnFlag(scope.row)">
+                        </el-switch>
+                    </template>
                 </el-table-column>
+				  <!--  <el-table-column label="操作" width="90" align="center" fixed="right">
+						<template slot-scope="scope">
+							<el-button type="text" size="mini" @click="edit(scope.row)">修改</el-button>
+						</template>
+					</el-table-column> -->
             </el-table>
         </view>
 
-        <ware-house-supplier-picker ref="supplierPicker" @selected="selectSupplier" @clear="clearSupplier">
-        </ware-house-supplier-picker>
+        <edit-trade-name-dialog ref="editTradeNameDialog" @success="refreshList"></edit-trade-name-dialog>
     </view>
 </template>
 
 <script>
 import WareHouseService from '@/api/psi/WareHouseService'
-import WareHouseSupplierPicker from './WareHouseSupplierPicker.vue'
+import EditTradeNameDialog from './EditTradeNameDialog.vue'
 
 export default {
     name: 'WareHouseSummaryList',
     components: {
-        WareHouseSupplierPicker
+        EditTradeNameDialog
     },
     data() {
         return {
             loading: false,
             searchForm: {
-                tradeName: '',
-                supplierId: '',
-                supplierName: ''
+                tradeName: ''
             },
             dataList: [],
             tablePage: {
@@ -99,9 +113,7 @@ export default {
     methods: {
         getSearchParams() {
             return {
-                tradeName: this.searchForm.tradeName,
-                supplierId: this.searchForm.supplierId,
-                supplierName: this.searchForm.supplierName
+                tradeName: this.searchForm.tradeName
             }
         },
         async refreshList() {
@@ -122,25 +134,10 @@ export default {
         },
         resetSearch() {
             this.searchForm = {
-                tradeName: '',
-                supplierId: '',
-                supplierName: ''
+                tradeName: ''
             }
             this.refreshList()
         },
-        openSupplierPicker() {
-            this.$refs.supplierPicker.open()
-        },
-        selectSupplier(item) {
-            this.searchForm.supplierId = item.id || ''
-            this.searchForm.supplierName = item.name || ''
-            this.refreshList()
-        },
-        clearSupplier() {
-            this.searchForm.supplierId = ''
-            this.searchForm.supplierName = ''
-            this.refreshList()
-        },
         formatNumber(value) {
             if (value === null || value === undefined || value === '') {
                 return '0'
@@ -162,6 +159,34 @@ export default {
                 return '0'
             }
             return Number.isInteger(value) ? String(value) : value.toFixed(4)
+        },
+        async updateWarnFlag(row) {
+            try {
+                await this.wareHouseService.updateWarnFlagByTradeNameAndType(row.tradeName, row.wareHouseType)
+                uni.showToast({
+                    title: '提醒状态已更新',
+                    icon: 'success'
+                })
+                this.refreshList()
+            } catch (e) {
+                this.refreshList()
+            }
+        },
+        async changeWarnNum(row) {
+            const warnNum = row.warnNum === '' || row.warnNum === null || row.warnNum === undefined ? 0 : row.warnNum
+            try {
+                await this.wareHouseService.updateWarnNumByTradeNameAndType(row.tradeName, row.wareHouseType, warnNum)
+                uni.showToast({
+                    title: '提醒数量已更新',
+                    icon: 'success'
+                })
+                this.refreshList()
+            } catch (e) {
+                this.refreshList()
+            }
+        },
+        edit(row) {
+            this.$refs.editTradeNameDialog.open(row)
         }
     }
 }

+ 0 - 191
pages/psiManagement/wareHouseSummary/WareHouseSupplierPicker.vue

@@ -1,191 +0,0 @@
-<template>
-    <view>
-        <view class="selector-mask" :class="{ show: visible }" @tap="close"></view>
-        <view class="selector-panel" :class="{ show: visible }">
-            <view class="selector-header">
-                <view class="selector-action" @tap="close">取消</view>
-                <view class="selector-title">选择供应商</view>
-                <view class="selector-action" @tap="clear">清空</view>
-            </view>
-            <view class="selector-search">
-                <u-search :show-action="false" v-model="keyword" placeholder="搜索供应商名称"></u-search>
-            </view>
-            <scroll-view scroll-y class="selector-list">
-                <view v-if="loading" class="selector-state">加载中...</view>
-                <view v-else-if="filteredList.length === 0" class="selector-state">暂无可选供应商</view>
-                <view v-else class="selector-list-inner">
-                    <view class="selector-card" v-for="item in filteredList" :key="item.id" @tap="select(item)">
-                        <view class="selector-name">{{ item.name }}</view>
-                        <view class="selector-meta">
-                            <text v-if="item.address">地址:{{ item.address }}</text>
-                            <text v-if="item.telPhone">联系电话:{{ item.telPhone }}</text>
-                        </view>
-                    </view>
-                </view>
-            </scroll-view>
-        </view>
-    </view>
-</template>
-
-<script>
-import SupplierService from '@/api/psi/SupplierService'
-
-export default {
-    name: 'WareHouseSupplierPicker',
-    data() {
-        return {
-            visible: false,
-            loading: false,
-            keyword: '',
-            supplierList: []
-        }
-    },
-    supplierService: null,
-    computed: {
-        filteredList() {
-            const keyword = (this.keyword || '').trim().toLowerCase()
-            if (!keyword) {
-                return this.supplierList
-            }
-            return this.supplierList.filter(item => (item.name || '').toLowerCase().includes(keyword))
-        }
-    },
-    created() {
-        this.supplierService = new SupplierService()
-    },
-    methods: {
-        async open() {
-            this.visible = true
-            this.keyword = ''
-            if (!this.supplierList.length) {
-                await this.loadSuppliers()
-            }
-        },
-        close() {
-            this.visible = false
-        },
-        async loadSuppliers() {
-            this.loading = true
-            try {
-                const data = await this.supplierService.list({
-                    current: 1,
-                    size: -1
-                })
-                this.supplierList = (data && data.records) || []
-            } finally {
-                this.loading = false
-            }
-        },
-        select(item) {
-            this.$emit('selected', item)
-            this.close()
-        },
-        clear() {
-            this.$emit('clear')
-            this.close()
-        }
-    }
-}
-</script>
-
-<style scoped>
-.selector-mask {
-    position: fixed;
-    inset: 0;
-    background: rgba(0, 0, 0, 0.35);
-    opacity: 0;
-    visibility: hidden;
-    transition: all 0.25s ease;
-    z-index: 1000;
-}
-
-.selector-mask.show {
-    opacity: 1;
-    visibility: visible;
-}
-
-.selector-panel {
-    position: fixed;
-    left: 0;
-    right: 0;
-    bottom: 0;
-    height: 68vh;
-    background: #f7f9fc;
-    border-radius: 28rpx 28rpx 0 0;
-    transform: translateY(100%);
-    transition: transform 0.25s ease;
-    z-index: 1001;
-    display: flex;
-    flex-direction: column;
-}
-
-.selector-panel.show {
-    transform: translateY(0);
-}
-
-.selector-header {
-    display: flex;
-    align-items: center;
-    justify-content: space-between;
-    padding: 28rpx 32rpx 16rpx;
-    background: #fff;
-    border-bottom: 1rpx solid #eef2f7;
-}
-
-.selector-title {
-    font-size: 32rpx;
-    font-weight: 600;
-    color: #1f2937;
-}
-
-.selector-action {
-    min-width: 80rpx;
-    font-size: 28rpx;
-    color: #2979ff;
-}
-
-.selector-search {
-    padding: 20rpx 24rpx 8rpx;
-    background: #fff;
-}
-
-.selector-list {
-    flex: 1;
-    padding: 16rpx 24rpx 32rpx;
-}
-
-.selector-list-inner {
-    display: flex;
-    flex-direction: column;
-    gap: 16rpx;
-}
-
-.selector-state {
-    padding-top: 120rpx;
-    text-align: center;
-    font-size: 28rpx;
-    color: #94a3b8;
-}
-
-.selector-card {
-    background: #fff;
-    border-radius: 20rpx;
-    padding: 24rpx;
-    box-shadow: 0 8rpx 24rpx rgba(15, 23, 42, 0.06);
-}
-
-.selector-name {
-    font-size: 30rpx;
-    font-weight: 600;
-    color: #0f172a;
-}
-
-.selector-meta {
-    display: flex;
-    flex-direction: column;
-    gap: 8rpx;
-    margin-top: 12rpx;
-    font-size: 24rpx;
-    color: #64748b;
-}
-</style>

+ 0 - 517
pages/psiManagement/wareHouseSummary/bak.vue

@@ -1,517 +0,0 @@
-<template>
-    <view class="page-wrap">
-<!--        <cu-custom :backUrl="'/pages/index/index'" :isBack="true" bgColor="bg-gradual-blue">
-            <block slot="content">库存列表</block>
-        </cu-custom> -->
-
-        <view class="search-panel">
-            <u-search :show-action="false" v-model="searchForm.tradeName" placeholder="搜索商品名称"
-                @search="refreshList" @clear="refreshList"></u-search>
-            <view class="filter-row">
-                <view class="filter-item" @tap="openTypePicker">
-                    <text class="filter-label">入库类型</text>
-                    <text class="filter-value">{{ searchForm.wareHouseTypeName || '全部' }}</text>
-                </view>
-                <view class="filter-item" @tap="openSupplierPicker">
-                    <text class="filter-label">供应商</text>
-                    <text class="filter-value">{{ searchForm.supplierName || '全部' }}</text>
-                </view>
-            </view>
-            <view class="action-row">
-                <el-button class="action-button" type="primary" @click="refreshList">查询</el-button>
-                <el-button class="action-button" plain @click="resetSearch">重置</el-button>
-            </view>
-        </view>
-
-        <view class="summary-row">
-            <text>共 {{ tablePage.total }} 条库存</text>
-            <text v-if="loading">加载中...</text>
-        </view>
-
-        <view v-if="!loading && dataList.length === 0" class="empty-state">暂无库存数据</view>
-
-        <view v-for="(item, index) in dataList" :key="item.id || item.tradeName + item.wareHouseType + index"
-            class="stock-card">
-            <view class="card-head">
-                <view class="goods-name">{{ item.tradeName || '-' }}</view>
-                <view class="type-badge">{{ item.wareHouseTypeName || '-' }}</view>
-            </view>
-
-            <view class="stock-main">
-                <view class="stock-number">
-                    <text class="number-label">剩余量:</text>
-                    <text class="number-value">{{ formatNumber(item.tradeNumber) }}</text>
-                    <!-- <text class="number-unit">{{ item.company || '' }}</text> -->
-                </view>
-                <view class="stock-total">
-                    <text>总量: {{ formatNumber(item.allNumber) }}</text>
-                    <text>单位: {{ item.company || '-' }}</text>
-                </view>
-            </view>
-
-            <view class="metric-grid">
-                <view class="metric-item">
-                    <text class="metric-label">领用量</text>
-                    <text class="metric-value">{{ calcBorrowNumber(item) }}</text>
-                </view>
-                <view class="metric-item">
-                    <text class="metric-label">报损量</text>
-                    <text class="metric-value">{{ calcLossNumber(item) }}</text>
-                </view>
-                <view class="metric-item">
-                    <text class="metric-label">提醒数量</text>
-                    <u--input class="warn-input" v-model="item.warnNum" placeholder="0" @blur="changeWarnNum(item)">
-                    </u--input>
-                </view>
-                <view class="metric-item">
-                    <text class="metric-label">是否提醒</text>
-                    <el-switch :value="item.warnFlag === '1'" active-color="#13ce66" inactive-color="#ff4949"
-                        @change="updateWarnFlag(item)">
-                    </el-switch>
-                </view>
-            </view>
-
-            <view class="card-actions">
-                <el-button class="card-button" type="primary" plain @click="openHistory(item)">查看记录</el-button>
-            </view>
-        </view>
-
-        <view v-if="dataList.length" class="load-more">
-            <text v-if="loadingMore">加载中...</text>
-            <text v-else-if="dataList.length >= tablePage.total">没有更多了</text>
-            <text v-else @tap="loadMore">加载更多</text>
-        </view>
-
-        <ba-tree-picker ref="typePicker" :multiple="false" @select-change="selectTypeChange" title="类型选择"
-            :localdata="typeTree" valueKey="value" textKey="label" childrenKey="children" />
-        <ware-house-supplier-picker ref="supplierPicker" @selected="selectSupplier" @clear="clearSupplier">
-        </ware-house-supplier-picker>
-        <ware-house-history-panel ref="historyPanel"></ware-house-history-panel>
-        <edit-trade-name-dialog ref="editTradeNameDialog" @success="refreshList"></edit-trade-name-dialog>
-    </view>
-</template>
-
-<script>
-import baTreePicker from '@/components/ba-tree-picker/ba-tree-picker.vue'
-import WareHouseService from '@/api/psi/WareHouseService'
-import MaterialTypeService from '@/api/psi/MaterialTypeService'
-import WareHouseSupplierPicker from './WareHouseSupplierPicker.vue'
-import WareHouseHistoryPanel from './WareHouseHistoryPanel.vue'
-import EditTradeNameDialog from './EditTradeNameDialog.vue'
-
-export default {
-    name: 'WareHouseSummaryList',
-    components: {
-        baTreePicker,
-        WareHouseSupplierPicker,
-        WareHouseHistoryPanel,
-        EditTradeNameDialog
-    },
-    data() {
-        return {
-            loading: false,
-            loadingMore: false,
-            searchForm: {
-                wareHouseType: '',
-                wareHouseTypeName: '',
-                tradeName: '',
-                supplierId: '',
-                supplierName: ''
-            },
-            dataList: [],
-            tablePage: {
-                total: 0,
-                currentPage: 1,
-                pageSize: 10,
-                orders: []
-            },
-            typeTree: []
-        }
-    },
-    wareHouseService: null,
-    materialTypeService: null,
-    created() {
-        this.wareHouseService = new WareHouseService()
-        this.materialTypeService = new MaterialTypeService()
-        this.loadTypeTree()
-        this.refreshList()
-    },
-    onPullDownRefresh() {
-        this.refreshList().finally(() => {
-            uni.stopPullDownRefresh()
-        })
-    },
-    onReachBottom() {
-        this.loadMore()
-    },
-    methods: {
-        async loadTypeTree() {
-            try {
-                const data = await this.materialTypeService.summaryTreeData({
-                    type: 'last'
-                })
-                this.typeTree = this.normalizeTree(data || [])
-            } catch (e) {
-                try {
-                    const data = await this.materialTypeService.cgList()
-                    this.typeTree = this.buildTree(data || [])
-                } catch (error) {
-                    this.typeTree = []
-                }
-            }
-        },
-        normalizeTree(nodes) {
-            return (nodes || []).map(item => ({
-                ...item,
-                value: item.value || item.id,
-                label: item.label || item.name,
-                children: this.normalizeTree(item.children || [])
-            }))
-        },
-        buildTree(nodes, parentId = '0') {
-            const tree = []
-            for (const node of nodes || []) {
-                if (node.parentId === parentId) {
-                    const children = this.buildTree(nodes, node.id)
-                    const treeNode = {
-                        ...node,
-                        value: node.value || node.id,
-                        label: node.label || node.name
-                    }
-                    if (children.length) {
-                        treeNode.children = children
-                    }
-                    tree.push(treeNode)
-                }
-            }
-            return tree
-        },
-        getSearchParams() {
-            return {
-                wareHouseType: this.searchForm.wareHouseType,
-                tradeName: this.searchForm.tradeName,
-                supplierId: this.searchForm.supplierId,
-                supplierName: this.searchForm.supplierName
-            }
-        },
-        async refreshList() {
-            this.tablePage.currentPage = 1
-            this.loading = true
-            try {
-                const data = await this.wareHouseService.wareHouseSummaryList({
-                    current: this.tablePage.currentPage,
-                    size: this.tablePage.pageSize,
-                    orders: this.tablePage.orders,
-                    ...this.getSearchParams()
-                })
-                this.dataList = (data && data.records) || []
-                this.tablePage.total = (data && data.total) || 0
-            } finally {
-                this.loading = false
-            }
-        },
-        async loadMore() {
-            if (this.loading || this.loadingMore || this.dataList.length >= this.tablePage.total) {
-                return
-            }
-            this.loadingMore = true
-            try {
-                const nextPage = this.tablePage.currentPage + 1
-                const data = await this.wareHouseService.wareHouseSummaryList({
-                    current: nextPage,
-                    size: this.tablePage.pageSize,
-                    orders: this.tablePage.orders,
-                    ...this.getSearchParams()
-                })
-                this.dataList = this.dataList.concat((data && data.records) || [])
-                this.tablePage.currentPage = nextPage
-                this.tablePage.total = (data && data.total) || this.tablePage.total
-            } finally {
-                this.loadingMore = false
-            }
-        },
-        resetSearch() {
-            this.searchForm = {
-                wareHouseType: '',
-                wareHouseTypeName: '',
-                tradeName: '',
-                supplierId: '',
-                supplierName: ''
-            }
-            this.refreshList()
-        },
-        openTypePicker() {
-            this.$refs.typePicker._show()
-        },
-        selectTypeChange(ids, names) {
-            this.searchForm.wareHouseType = (ids && ids[0]) || ''
-            this.searchForm.wareHouseTypeName = Array.isArray(names) ? names.join('/') : names
-            this.refreshList()
-        },
-        openSupplierPicker() {
-            this.$refs.supplierPicker.open()
-        },
-        selectSupplier(item) {
-            this.searchForm.supplierId = item.id || ''
-            this.searchForm.supplierName = item.name || ''
-            this.refreshList()
-        },
-        clearSupplier() {
-            this.searchForm.supplierId = ''
-            this.searchForm.supplierName = ''
-            this.refreshList()
-        },
-        formatNumber(value) {
-            if (value === null || value === undefined || value === '') {
-                return '0'
-            }
-            return value
-        },
-        calcBorrowNumber(row) {
-            if (row.notSurplusStock && row.spec) {
-                return this.trimNumber(parseFloat(row.notSurplusStock) / parseFloat(row.spec))
-            }
-            return '0'
-        },
-        calcLossNumber(row) {
-            if (row.lossNumber && row.spec) {
-                return this.trimNumber(parseFloat(row.lossNumber) / parseFloat(row.spec))
-            }
-            return '0'
-        },
-        trimNumber(value) {
-            if (Number.isNaN(value)) {
-                return '0'
-            }
-            return Number.isInteger(value) ? String(value) : value.toFixed(2)
-        },
-        async updateWarnFlag(row) {
-            try {
-                await this.wareHouseService.updateWarnFlagByTradeNameAndType(row.tradeName, row.wareHouseType)
-                uni.showToast({
-                    title: '提醒状态已更新',
-                    icon: 'success'
-                })
-                this.refreshList()
-            } catch (e) {
-                this.refreshList()
-            }
-        },
-        async changeWarnNum(row) {
-            const warnNum = row.warnNum === '' || row.warnNum === null || row.warnNum === undefined ? 0 : row.warnNum
-            try {
-                await this.wareHouseService.updateWarnNumByTradeNameAndType(row.tradeName, row.wareHouseType, warnNum)
-                uni.showToast({
-                    title: '提醒数量已更新',
-                    icon: 'success'
-                })
-                this.refreshList()
-            } catch (e) {
-                this.refreshList()
-            }
-        },
-        openHistory(row) {
-            this.$refs.historyPanel.open(row, this.searchForm.supplierId)
-        },
-        openEditTradeName(row) {
-            this.$refs.editTradeNameDialog.open(row)
-        }
-    }
-}
-</script>
-
-<style scoped>
-.page-wrap {
-    min-height: 100vh;
-    padding: 20rpx 24rpx 48rpx;
-    background: #f6f8fb;
-}
-
-.search-panel {
-    padding: 22rpx;
-    background: #fff;
-    border-radius: 18rpx;
-    box-shadow: 0 8rpx 24rpx rgba(15, 23, 42, 0.05);
-}
-
-.filter-row {
-    display: grid;
-    grid-template-columns: repeat(2, minmax(0, 1fr));
-    gap: 16rpx;
-    margin-top: 18rpx;
-}
-
-.filter-item {
-    min-width: 0;
-    padding: 18rpx 20rpx;
-    background: #f8fafc;
-    border-radius: 14rpx;
-}
-
-.filter-label {
-    display: block;
-    font-size: 22rpx;
-    color: #64748b;
-}
-
-.filter-value {
-    display: block;
-    margin-top: 8rpx;
-    font-size: 26rpx;
-    color: #0f172a;
-    overflow: hidden;
-    text-overflow: ellipsis;
-    white-space: nowrap;
-}
-
-.action-row {
-    display: flex;
-    gap: 16rpx;
-    margin-top: 18rpx;
-}
-
-.action-button {
-    flex: 1;
-}
-
-.summary-row {
-    display: flex;
-    justify-content: space-between;
-    padding: 22rpx 4rpx 12rpx;
-    font-size: 24rpx;
-    color: #64748b;
-}
-
-.empty-state {
-    padding: 120rpx 0;
-    text-align: center;
-    font-size: 28rpx;
-    color: #94a3b8;
-}
-
-.stock-card {
-    margin-bottom: 20rpx;
-    padding: 24rpx;
-    background: #fff;
-    border-radius: 18rpx;
-    box-shadow: 0 8rpx 24rpx rgba(15, 23, 42, 0.05);
-}
-
-.card-head {
-    display: flex;
-    align-items: flex-start;
-    justify-content: space-between;
-    gap: 16rpx;
-}
-
-.goods-name {
-    flex: 1;
-    font-size: 31rpx;
-    font-weight: 700;
-    line-height: 1.4;
-    color: #0f172a;
-    word-break: break-all;
-}
-
-.type-badge {
-    max-width: 260rpx;
-    padding: 8rpx 14rpx;
-    border-radius: 999rpx;
-    font-size: 22rpx;
-    color: #1d4ed8;
-    background: #dbeafe;
-    overflow: hidden;
-    text-overflow: ellipsis;
-    white-space: nowrap;
-}
-
-.stock-main {
-    display: flex;
-    justify-content: space-between;
-    gap: 20rpx;
-    margin-top: 24rpx;
-    padding: 22rpx;
-    background: #f8fafc;
-    border-radius: 16rpx;
-}
-
-.stock-number {
-    display: flex;
-    align-items: baseline;
-    gap: 8rpx;
-}
-
-.number-label {
-    font-size: 22rpx;
-    color: #64748b;
-}
-
-.number-value {
-    font-size: 46rpx;
-    font-weight: 800;
-    color: #0f766e;
-}
-
-.number-unit {
-    font-size: 24rpx;
-    color: #475569;
-}
-
-.stock-total {
-    display: flex;
-    flex-direction: column;
-    gap: 8rpx;
-    text-align: right;
-    font-size: 24rpx;
-    color: #475569;
-}
-
-.metric-grid {
-    display: grid;
-    grid-template-columns: repeat(2, minmax(0, 1fr));
-    gap: 16rpx;
-    margin-top: 18rpx;
-}
-
-.metric-item {
-    min-width: 0;
-    padding: 18rpx;
-    background: #fbfdff;
-    border: 1rpx solid #eef2f7;
-    border-radius: 14rpx;
-}
-
-.metric-label {
-    display: block;
-    margin-bottom: 10rpx;
-    font-size: 22rpx;
-    color: #64748b;
-}
-
-.metric-value {
-    font-size: 28rpx;
-    font-weight: 600;
-    color: #0f172a;
-}
-
-.warn-input {
-    width: 100%;
-}
-
-.card-actions {
-    display: grid;
-    gap: 16rpx;
-    margin-top: 18rpx;
-}
-
-.card-button {
-    width: 100%;
-}
-
-.load-more {
-    padding: 24rpx 0;
-    text-align: center;
-    font-size: 26rpx;
-    color: #64748b;
-}
-</style>