master
lion 2 weeks ago
parent 7a9e48393d
commit 868dee8313

@ -35,7 +35,7 @@
</div> </div>
<!-- Plan Table --> <!-- Plan Table -->
<Table :columns="planColumns" :data="planList" :loading="planLoading"> <Table :columns="planColumns" :data="planList" :loading="planLoading" height="400">
<template slot="status" slot-scope="{ row }"> <template slot="status" slot-scope="{ row }">
<Tag :color="getStatusColor(row.status)">{{ getStatusText(row.status) }}</Tag> <Tag :color="getStatusColor(row.status)">{{ getStatusText(row.status) }}</Tag>
</template> </template>
@ -126,17 +126,17 @@
<!-- 计划内 Tab --> <!-- 计划内 Tab -->
<TabPane label="计划内" name="plan"> <TabPane label="计划内" name="plan">
<!-- Plan Search Filters --> <!-- Plan Search Filters -->
<div class="search-filters"> <div class="search-filters">
<div class="filter-item"> <div class="filter-item">
<span class="selector-item__label">关键词:</span> <span class="selector-item__label">关键词:</span>
<Input <Input
v-model="historyPlanSearch.keyword" v-model="historyPlanSearch.keyword"
style="width: 180px" style="width: 180px"
:clearable="true" :clearable="true"
placeholder="计划名称/编号" placeholder="计划名称/编号"
/> />
</div> </div>
<div class="filter-item"> <div class="filter-item">
<span class="selector-item__label">计划日期:</span> <span class="selector-item__label">计划日期:</span>
<DatePicker <DatePicker
v-model="historyPlanSearch.dateRange" v-model="historyPlanSearch.dateRange"
@ -145,21 +145,21 @@
style="width: 200px" style="width: 200px"
:clearable="true" :clearable="true"
/> />
</div> </div>
<div class="filter-item"> <div class="filter-item">
<Button type="primary" @click="searchHistoryPlans"></Button> <Button type="primary" @click="searchHistoryPlans"></Button>
<Button style="margin-left: 10px" @click="resetHistoryPlanSearch"></Button> <Button style="margin-left: 10px" @click="resetHistoryPlanSearch"></Button>
</div> </div>
</div> </div>
<!-- Plan Table --> <!-- Plan Table -->
<Table :columns="planColumns" :data="historyPlanList" :loading="historyPlanLoading"> <Table :columns="planColumns" :data="historyPlanList" :loading="historyPlanLoading">
<template slot="status" slot-scope="{ row }"> <template slot="status" slot-scope="{ row }">
<Tag :color="getStatusColor(row.status)">{{ getStatusText(row.status) }}</Tag> <Tag :color="getStatusColor(row.status)">{{ getStatusText(row.status) }}</Tag>
</template> </template>
<template slot="progress" slot-scope="{ row }"> <template slot="progress" slot-scope="{ row }">
<Progress :percent="getPlanProgress(row)" :stroke-width="15" /> <Progress :percent="getPlanProgress(row)" :stroke-width="15" />
</template> </template>
<template slot="action" slot-scope="{ row }"> <template slot="action" slot-scope="{ row }">
<div style="display: flex; gap: 8px; justify-content: center"> <div style="display: flex; gap: 8px; justify-content: center">
<Button <Button
@ -181,7 +181,7 @@
</el-dropdown-menu> </el-dropdown-menu>
</el-dropdown> </el-dropdown>
</div> </div>
</template> </template>
</Table> </Table>
<!-- Plan Pagination --> <!-- Plan Pagination -->
@ -200,70 +200,44 @@
<!-- 计划外 Tab --> <!-- 计划外 Tab -->
<TabPane label="计划外" name="outside"> <TabPane label="计划外" name="outside">
<!-- List Search Filters --> <!-- List Search Filters -->
<div class="search-filters"> <div class="search-filters">
<div class="filter-item"> <div class="filter-item">
<span class="selector-item__label">关键词:</span> <span class="selector-item__label">盘点日期:</span>
<Input <DatePicker
v-model="listSearch.keyword" v-model="listSearch.dateRange"
type="daterange"
split-panels
style="width: 200px"
:clearable="true" :clearable="true"
style="width: 180px"
placeholder="单号/计划/区域/执行人"
/> />
</div> </div>
<div class="filter-item">
<span class="selector-item__label">所属计划:</span>
<Select v-model="listSearch.planId" style="width: 180px" :clearable="true">
<Option v-for="plan in planList" :key="plan.id" :value="plan.id">{{
plan.name
}}</Option>
</Select>
</div>
<div class="filter-item">
<span class="selector-item__label">状态:</span>
<Select v-model="listSearch.status" style="width: 120px" :clearable="true">
<Option value="0">未盘点</Option>
<Option value="1">已盘点</Option>
</Select>
</div>
<div class="filter-item"> <div class="filter-item">
<Button type="primary" @click="searchList"></Button> <Button type="primary" @click="searchList"></Button>
<Button style="margin-left: 10px" @click="resetListSearch"></Button> <Button style="margin-left: 10px" @click="resetListSearch"></Button>
</div> </div>
</div> </div>
<!-- Inventory List Table --> <!-- History List Table -->
<Table :columns="listColumns" :data="inventoryList" :loading="listLoading"> <Table :columns="outsideListColumns" :data="inventoryList" :loading="listLoading" border height="400">
<template slot="planName" slot-scope="{ row }">
{{ row.material_infos_plan ? row.material_infos_plan.name : '-' }}
</template>
<template slot="area" slot-scope="{ row }">
{{ row.material_info ? row.material_info.suozaicangku : '-' }}
</template>
<template slot="executor" slot-scope="{ row }">
{{ row.responsible_admin ? row.responsible_admin.name : '-' }}
</template>
<template slot="startTime" slot-scope="{ row }">
{{ row.material_infos_plan ? row.material_infos_plan.start_date : '-' }}
</template>
<template slot="endTime" slot-scope="{ row }">
{{ row.material_infos_plan ? row.material_infos_plan.end_date : '-' }}
</template>
<template slot="status" slot-scope="{ row }"> <template slot="status" slot-scope="{ row }">
<Tag :color="getInventoryStatusColor(row.status)">{{ <Tag :color="getInventoryStatusColor(row.status)">{{
getInventoryStatusText(row.status) getInventoryStatusText(row.status)
}}</Tag> }}</Tag>
</template> </template>
<template slot="action" slot-scope="{ row }"> <template slot="responsible_admin" slot-scope="{ row }">
<div style="display: flex; gap: 8px; justify-content: center"> {{ row.responsible_admin ? row.responsible_admin.name : '-' }}
<Button </template>
type="primary" <template slot="photos" slot-scope="{ row }">
size="small" <div v-if="row.files && row.files.length" class="photo-list">
style="border-radius: 6px" <div v-for="(file, index) in row.files.slice(0, 3)" :key="index" class="photo-item">
@click="viewInventoryDetail(row)" <img :src="file.url" @click="previewImage(file.url)" />
>查看</Button
>
</div> </div>
<div v-if="row.files.length > 3" class="photo-more">
+{{ row.files.length - 3 }}
</div>
</div>
<span v-else>-</span>
</template> </template>
</Table> </Table>
@ -863,8 +837,8 @@ export default {
listSearch: { listSearch: {
keyword: '', keyword: '',
planId: '',
status: '', status: '',
dateRange: [],
pageIndex: 1, pageIndex: 1,
pageSize: 10 pageSize: 10
}, },
@ -1233,6 +1207,138 @@ export default {
align: 'center' align: 'center'
} }
], ],
outsideListColumns: [
{
title: '一级分类',
key: 'yijifenlei',
width: 120,
align: 'center',
render: (h, params) => {
if (!params.row.inventory || !params.row.inventory.wuzibianma_material_infos_wuzibianma_relation) {
return h('span', '-')
}
const materialInfoType = params.row.inventory.wuzibianma_material_infos_wuzibianma_relation.material_info_type
const value = materialInfoType ? materialInfoType.split('-')[0] : ''
return h('span', value || '-')
}
},
{
title: '二级分类',
key: 'erjifenlei',
width: 120,
align: 'center',
render: (h, params) => {
if (!params.row.inventory || !params.row.inventory.wuzibianma_material_infos_wuzibianma_relation) {
return h('span', '-')
}
const materialInfoType = params.row.inventory.wuzibianma_material_infos_wuzibianma_relation.material_info_type
let value = ''
if (materialInfoType) {
const parts = materialInfoType.split('-')
value = parts.length > 1 ? parts[1] : parts[0]
}
return h('span', value || '-')
}
},
{
title: '所属种类',
key: 'suoshuzhonglei',
width: 120,
align: 'center',
render: (h, params) => {
if (!params.row.inventory || !params.row.inventory.wuzibianma_material_infos_wuzibianma_relation) {
return h('span', '-')
}
const fenleiDetail = params.row.inventory.wuzibianma_material_infos_wuzibianma_relation.fenlei_detail
const value = fenleiDetail ? fenleiDetail.name : ''
return h('span', value || '-')
}
},
{
title: '物资名称',
key: 'zichanmingcheng',
minWidth: 150,
align: 'center',
render: (h, params) => {
return h('span', params.row.inventory ? params.row.inventory.zichanmingcheng : '-')
}
},
{
title: '物资型号',
key: 'guigexinghao',
width: 120,
align: 'center',
render: (h, params) => {
return h('span', params.row.inventory ? params.row.inventory.guigexinghao : '-')
}
},
{
title: '物资规格',
key: 'wuziguige',
width: 120,
align: 'center',
render: (h, params) => {
return h('span', params.row.inventory ? params.row.inventory.wuziguige : '-')
}
},
{
title: '单位',
key: 'jiliangdanwei',
width: 80,
align: 'center',
render: (h, params) => {
return h('span', params.row.inventory ? params.row.inventory.jiliangdanwei : '-')
}
},
{
title: '原库存数量',
key: 'chushishuliang',
width: 120,
align: 'center',
render: (h, params) => {
return h('span', params.row.inventory ? params.row.inventory.chushishuliang : '-')
}
},
{
title: '盘点日期',
key: 'check_date',
width: 180,
align: 'center'
},
{
title: '盘点数量',
key: 'check_num',
width: 100,
align: 'center'
},
{
title: '状态',
slot: 'status',
key: 'status',
width: 100,
align: 'center'
},
{
title: '盘点人',
slot: 'responsible_admin',
key: 'responsible_admin',
width: 120,
align: 'center'
},
{
title: '照片',
slot: 'photos',
width: 200,
align: 'center'
},
{
title: '备注',
key: 'remark',
minWidth: 200,
tooltip: true,
align: 'center'
}
],
previewUrl: '', previewUrl: '',
planDetailModal: { planDetailModal: {
visible: false, visible: false,
@ -1605,38 +1711,52 @@ export default {
async searchList() { async searchList() {
this.listLoading = true this.listLoading = true
try { try {
const formData = new FormData() const params = {
formData.append('page', this.listSearch.pageIndex) page: this.listSearch.pageIndex,
formData.append('page_size', this.listSearch.pageSize) page_size: this.listSearch.pageSize,
has_material_infos_plan_id: '0'
//
formData.append('has_material_infos_plan_id', '0')
//
if (this.listSearch.keyword) {
formData.append('keyword', this.listSearch.keyword)
} }
// //
if (this.listSearch.planId) { if (
const filterIndex = this.listSearch.keyword ? 1 : 0 this.listSearch.dateRange &&
formData.append(`filter[${filterIndex}][key]`, 'material_infos_plan_id') this.listSearch.dateRange.length === 2 &&
formData.append(`filter[${filterIndex}][op]`, 'eq') this.listSearch.dateRange[0] &&
formData.append(`filter[${filterIndex}][value]`, this.listSearch.planId) this.listSearch.dateRange[1]
} ) {
const formatDate = date => {
const d = new Date(date)
if (isNaN(d.getTime())) return null //
const year = d.getFullYear()
const month = String(d.getMonth() + 1).padStart(2, '0')
const day = String(d.getDate()).padStart(2, '0')
return `${year}-${month}-${day}`
}
// const startDate = formatDate(this.listSearch.dateRange[0])
if (this.listSearch.status) { const endDate = formatDate(this.listSearch.dateRange[1])
const filterIndex = (this.listSearch.keyword ? 1 : 0) + (this.listSearch.planId ? 1 : 0)
formData.append(`filter[${filterIndex}][key]`, 'status') //
formData.append(`filter[${filterIndex}][op]`, 'eq') if (startDate && endDate) {
formData.append(`filter[${filterIndex}][value]`, this.listSearch.status) params['filter[0][key]'] = 'check_date'
params['filter[0][op]'] = 'range'
params['filter[0][value]'] = startDate + ',' + endDate
}
} }
const res = await getStocktakingPlanLinkList(formData) const res = await getStocktakingHistoryList(qs.stringify(params))
if (res && res.list) { if (res) {
// res.data res.list.data
if (res.list && res.list.data) {
this.inventoryList = res.list.data this.inventoryList = res.list.data
this.listTotal = res.list.total this.listTotal = res.list.total || res.list.data.length
} else if (res.data) {
this.inventoryList = res.data
this.listTotal = res.total || res.data.length
} else {
this.inventoryList = []
this.listTotal = 0
}
} }
} catch (error) { } catch (error) {
this.$Message.error('获取盘点列表失败') this.$Message.error('获取盘点列表失败')
@ -1648,8 +1768,8 @@ export default {
resetListSearch() { resetListSearch() {
this.listSearch = { this.listSearch = {
keyword: '', keyword: '',
planId: '',
status: '', status: '',
dateRange: [],
pageIndex: 1, pageIndex: 1,
pageSize: 10 pageSize: 10
} }
@ -2196,7 +2316,7 @@ export default {
}, },
showSummaryModal(row) { showSummaryModal(row) {
// //
console.log("this.planList",this.historyPlanList) console.log('this.planList', this.historyPlanList)
const planData = this.historyPlanList.find(plan => plan.id === row.id) const planData = this.historyPlanList.find(plan => plan.id === row.id)
if (!planData) { if (!planData) {
this.$Message.error('未找到计划数据') this.$Message.error('未找到计划数据')
@ -2214,7 +2334,7 @@ export default {
actualCount: planData.chart_done || '-' actualCount: planData.chart_done || '-'
} }
this.summaryModal.signImageId = planData.sign_id || null this.summaryModal.signImageId = planData.sign_id || null
this.summaryModal.signImage = planData.sign?planData.sign.url:null this.summaryModal.signImage = planData.sign ? planData.sign.url : null
this.summaryModal.visible = true this.summaryModal.visible = true
}, },
beforeSignUpload(file) { beforeSignUpload(file) {

Loading…
Cancel
Save