Blame view

antis-ncc-admin/src/views/lqInventory/export-usage-dialog.vue 6.97 KB
80757fb6   “wangming”   revert: 回退 Replac...
1
2
3
4
5
6
7
8
9
  <template>
  	<el-dialog title="导出仓库使用记录" :close-on-click-modal="false" :visible.sync="visible"
  		class="NCC-dialog NCC-dialog_center" lock-scroll width="700px">
  		<el-form label-position="right" label-width="120px">
  			<el-form-item label="门店">
  				<el-select v-model="exportQuery.storeId" placeholder="请选择门店(可选)" clearable filterable style="width: 100%">
  					<el-option v-for="store in storeOptions" :key="store.id" :label="store.dm" :value="store.id" />
  				</el-select>
  			</el-form-item>
97c1bdaf   “wangming”   feat: 优化库存扣减逻辑和报销...
10
11
12
13
  			<el-form-item label="产品">
  				<el-select v-model="exportQuery.productId" placeholder="请选择产品(可选)" clearable filterable style="width: 100%">
  					<el-option v-for="product in productOptions" :key="product.id" :label="product.productName" :value="product.id" />
  				</el-select>
80757fb6   “wangming”   revert: 回退 Replac...
14
15
16
17
18
19
20
21
22
23
  			</el-form-item>
  			<el-form-item label="批次号">
  				<el-input v-model="exportQuery.usageBatchId" placeholder="请输入批次号(可选)" clearable />
  			</el-form-item>
  			<el-form-item label="使用时间">
  				<el-date-picker v-model="usageTimeRange" type="datetimerange" range-separator="至"
  					start-placeholder="开始时间" end-placeholder="结束时间" value-format="yyyy-MM-dd HH:mm:ss"
  					format="yyyy-MM-dd HH:mm:ss" style="width: 100%" />
  			</el-form-item>
  			<el-form-item label="审批状态">
97c1bdaf   “wangming”   feat: 优化库存扣减逻辑和报销...
24
25
26
27
28
29
30
  				<el-select v-model="exportQuery.approvalStatus" placeholder="请选择审批状态(可选)" clearable style="width: 100%">
  					<el-option label="全部" value="" />
  					<el-option label="待审批" value="待审批" />
  					<el-option label="审批中" value="审批中" />
  					<el-option label="已通过" value="已通过" />
  					<el-option label="未通过" value="未通过" />
  					<el-option label="已退回" value="已退回" />
80757fb6   “wangming”   revert: 回退 Replac...
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
  				</el-select>
  			</el-form-item>
  			<el-form-item label="是否已领取">
  				<el-select v-model="exportQuery.isReceived" placeholder="请选择(可选)" clearable style="width: 100%">
  					<el-option label="全部" :value="null" />
  					<el-option label="已领取" :value="true" />
  					<el-option label="未领取" :value="false" />
  				</el-select>
  			</el-form-item>
  			<el-form-item label="是否有效">
  				<el-select v-model="exportQuery.isEffective" placeholder="请选择(可选)" clearable style="width: 100%">
  					<el-option label="全部" :value="null" />
  					<el-option label="有效" :value="true" />
  					<el-option label="无效" :value="false" />
  				</el-select>
  			</el-form-item>
  			<el-form-item label="导出说明">
  				<div class="export-info">
  					<p>• 导出包含11个字段:批次号、产品名称、门店名称、使用数量、单价、总金额、使用时间、归属仓库、审批状态、是否已领取、是否有效</p>
  					<p>• 所有字段都会显示中文名称,无需手动选择</p>
  					<p>• 支持按门店、产品、批次号、使用时间、审批状态、是否已领取、是否有效进行筛选</p>
  				</div>
  			</el-form-item>
  		</el-form>
  		<span slot="footer" class="dialog-footer">
  			<el-button @click="visible = false">取 消</el-button>
  			<el-button type="primary" @click="handleExport" :loading="btnLoading">导 出</el-button>
  		</span>
  	</el-dialog>
  </template>
  
  <script>
  import request from '@/utils/request'
  
  export default {
  	name: 'ExportUsageDialog',
  	props: {
  		storeOptions: {
  			type: Array,
  			default: () => []
  		}
  	},
  	data() {
  		return {
  			visible: false,
  			btnLoading: false,
  			exportQuery: {
  				storeId: undefined,
  				productId: undefined,
  				usageBatchId: undefined,
  				usageStartTime: undefined,
  				usageEndTime: undefined,
97c1bdaf   “wangming”   feat: 优化库存扣减逻辑和报销...
83
  				approvalStatus: undefined,
80757fb6   “wangming”   revert: 回退 Replac...
84
85
86
  				isReceived: undefined,
  				isEffective: undefined
  			},
97c1bdaf   “wangming”   feat: 优化库存扣减逻辑和报销...
87
88
  			usageTimeRange: null,
  			productOptions: [] // 产品选项
80757fb6   “wangming”   revert: 回退 Replac...
89
90
91
92
93
94
95
96
97
98
99
100
  		}
  	},
  	methods: {
  		init() {
  			this.visible = true
  			// 重置表单
  			this.exportQuery = {
  				storeId: undefined,
  				productId: undefined,
  				usageBatchId: undefined,
  				usageStartTime: undefined,
  				usageEndTime: undefined,
97c1bdaf   “wangming”   feat: 优化库存扣减逻辑和报销...
101
  				approvalStatus: undefined,
80757fb6   “wangming”   revert: 回退 Replac...
102
103
104
105
  				isReceived: undefined,
  				isEffective: undefined
  			}
  			this.usageTimeRange = null
97c1bdaf   “wangming”   feat: 优化库存扣减逻辑和报销...
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
  			// 加载产品选项
  			this.initProductOptions()
  		},
  		// 加载产品选项
  		initProductOptions() {
  			request({
  				url: '/api/Extend/LqProduct/GetList',
  				method: 'GET',
  				data: {
  					currentPage: 1,
  					pageSize: 1000,
  					onShelfStatus: 1  // 只获取上架的产品
  				}
  			}).then(res => {
  				if (res.code == 200 && res.data && res.data.list) {
  					this.productOptions = res.data.list.filter(product => product.onShelfStatus === 1)
  				} else {
  					this.productOptions = []
  				}
  			}).catch(() => {
  				this.productOptions = []
  			})
80757fb6   “wangming”   revert: 回退 Replac...
128
129
130
131
132
133
134
135
136
137
138
139
  		},
  		handleExport() {
  			this.btnLoading = true
  			// 构建导出查询参数
  			let exportParams = { ...this.exportQuery }
  			
  			// 处理时间范围
  			if (this.usageTimeRange && this.usageTimeRange.length === 2) {
  				exportParams.usageStartTime = this.usageTimeRange[0]
  				exportParams.usageEndTime = this.usageTimeRange[1]
  			}
  			
97c1bdaf   “wangming”   feat: 优化库存扣减逻辑和报销...
140
141
142
143
144
145
146
147
  			// 处理布尔值参数(转换为字符串true/false)
  			if (exportParams.isReceived !== undefined && exportParams.isReceived !== null) {
  				exportParams.isReceived = exportParams.isReceived === true || exportParams.isReceived === 'true'
  			}
  			if (exportParams.isEffective !== undefined && exportParams.isEffective !== null) {
  				exportParams.isEffective = exportParams.isEffective === true || exportParams.isEffective === 'true'
  			}
  			
80757fb6   “wangming”   revert: 回退 Replac...
148
149
150
151
152
153
154
155
156
  			// 移除空值
  			Object.keys(exportParams).forEach(key => {
  				if (exportParams[key] === undefined || exportParams[key] === null || exportParams[key] === '') {
  					delete exportParams[key]
  				}
  			})
  			
  			// 构建查询字符串
  			const queryString = Object.keys(exportParams)
97c1bdaf   “wangming”   feat: 优化库存扣减逻辑和报销...
157
158
159
160
161
162
163
164
  				.map(key => {
  					const value = exportParams[key]
  					// 布尔值转换为字符串
  					if (typeof value === 'boolean') {
  						return `${key}=${value}`
  					}
  					return `${key}=${encodeURIComponent(value)}`
  				})
80757fb6   “wangming”   revert: 回退 Replac...
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
  				.join('&')
  			
  			// 调用导出接口
  			const url = `/api/Extend/LqInventoryUsage/ExportExcel${queryString ? '?' + queryString : ''}`
  			
  			request({
  				url: url,
  				method: 'GET'
  			}).then(res => {
  				this.btnLoading = false
  				if (res.code === 200 && res.data) {
  					// 如果返回的是下载链接
  					if (res.data.url) {
  						// 构建完整URL
  						const baseUrl = window.location.origin
  						const downloadUrl = baseUrl + res.data.url
  						window.open(downloadUrl, '_blank')
  						this.$message.success('导出成功')
  						this.visible = false
  					} else {
  						this.$message.error('导出失败:未返回下载链接')
  					}
  				} else {
  					this.$message.error(res.msg || '导出失败')
  				}
  			}).catch(err => {
  				this.btnLoading = false
  				console.error('导出失败:', err)
  				this.$message.error('导出失败,请稍后重试')
  			})
  		}
  	}
  }
  </script>
  
  <style lang="scss" scoped>
  .export-info {
  	padding: 10px;
  	background-color: #f5f7fa;
  	border-radius: 4px;
  	
  	p {
  		margin: 5px 0;
  		font-size: 13px;
  		color: #606266;
  		line-height: 1.6;
  	}
  }
  </style>