You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

449 lines
15 KiB

  1. <template>
  2. <div class="customer-css">
  3. <el-dialog :title="titleCon" :close-on-click-modal="false" :visible.sync="visible" width="380px" class="customer-dialog" @close="deleteFile">
  4. <el-form :inline="true" label-position="top" label-width="80px">
  5. <el-row>
  6. <el-form-item label="BU">
  7. <el-select v-model="pageData.buNo" placeholder="请选择" disabled style="width: 110px">
  8. <el-option
  9. v-for = "i in buList"
  10. :key = "i.buNo"
  11. :label = "i.buDesc"
  12. :value = "i.buNo">
  13. </el-option>
  14. </el-select>
  15. </el-form-item>
  16. <el-form-item :label="'CMC Invoice:'">
  17. <el-input v-model="pageData.cmcInvoice" disabled style="width: 110px"></el-input>
  18. </el-form-item>
  19. <el-form-item label=" ">
  20. <el-button type="primary" @click="exportExcel()">下载文件模板</el-button>
  21. </el-form-item>
  22. </el-row>
  23. </el-form>
  24. <!-- 栈板托数记录 -->
  25. <div style="margin: 15px 0;">
  26. <div style="margin-bottom: 10px;">
  27. <span >栈板记录:</span>
  28. <el-tooltip effect="dark" placement="top">
  29. <div slot="content">
  30. <div>栈板维护功能说明</div>
  31. <div> 系统会自动加载当前BU下的所有栈板</div>
  32. <div> 栈板高度单位为米(M)请输入准确数值</div>
  33. <div> 只有托数大于0的栈板记录才会被保存</div>
  34. </div>
  35. <i class="el-icon-question" style="color: #17b3a3; margin-left: 8px; cursor: pointer; font-size: 16px;"></i>
  36. </el-tooltip>
  37. </div>
  38. <el-table :data="palletRecords" border style="width: 100%; margin-bottom: 15px;" class="zxClass"
  39. max-height="200" v-if="palletRecords.length > 0">
  40. <el-table-column label="栈板类型" min-width="100">
  41. <template slot-scope="scope">
  42. <el-input v-model="scope.row.palletType" disabled style="width: 100%;"></el-input>
  43. </template>
  44. </el-table-column>
  45. <el-table-column label="栈板高度(M)" width="100">
  46. <template slot-scope="scope">
  47. <el-input v-model="scope.row.height" type="text" placeholder="请输入高度" style="width: 100%;"></el-input>
  48. </template>
  49. </el-table-column>
  50. <el-table-column label="托数" width="80">
  51. <template slot-scope="scope">
  52. <el-input v-model="scope.row.palletQty" type="text" placeholder="请输入托数" style="width: 100%;"></el-input>
  53. </template>
  54. </el-table-column>
  55. </el-table>
  56. <div v-if="palletRecords.length === 0" style="text-align: center; color: #999; padding: 20px; border: 1px dashed #ddd;">
  57. 正在加载栈板记录...
  58. </div>
  59. </div>
  60. <!-- 文件上传区域 -->
  61. <div style="margin: 15px 0;">
  62. <div style="margin-bottom: 10px;">文件上传:</div>
  63. <el-upload class="customer-upload" drag action="javascript:void(0);" ref="uploadFile" :limit="1" accept=".xlsx,.xls"
  64. :before-upload="beforeUploadHandle" :on-change="onChange" :auto-upload="false" style="text-align: left;">
  65. <i class="el-icon-upload"></i>
  66. <div class="el-upload__text">将文件拖到此处<em>点击上传</em></div>
  67. </el-upload>
  68. </div>
  69. <span slot="footer" class="dialog-footer">
  70. <el-button type="primary" :loading="saveLoading" :disabled="saveLoading" @click="saveUploadFile">保存</el-button>
  71. <el-button type="primary" @click="closeDialog">关闭</el-button>
  72. </span>
  73. </el-dialog>
  74. </div>
  75. </template>
  76. <script>
  77. import {queryFileId} from "@/api/qc/qc.js"
  78. import {saveCoDelPalletDataByExcel,searchEcssCoDelNotifyDetail,updateExportFlag,searchPalletList} from '@/api/ecss/ecss.js'
  79. import {downLoadObjectFile} from '@/api/eam/eam_object_list.js'
  80. import {getBuList}from '@/api/factory/site.js'
  81. import excel from "@/utils/excel-util.js";
  82. import excelOpts from '@/utils/export-options.js'
  83. export default {
  84. name: 'bomComponentUpload',
  85. data() {
  86. return {
  87. buList: [],
  88. titleCon: '文件导入',
  89. visible: false,
  90. saveLoading: false,
  91. fileList: [],
  92. pageData: {
  93. site: '',
  94. buNo: '',
  95. delNo:'',
  96. cmcInvoice:'',
  97. createBy: this.$store.state.user.name,
  98. },
  99. // 栈板记录
  100. palletRecords: [],
  101. // 导出 start
  102. exportData: [],
  103. exportName: '装箱数据导入模版',
  104. exportHeader: [""],
  105. exportFooter: [],
  106. // 导出 end
  107. columnList1: [
  108. {
  109. columnProp: "seqNo",
  110. columnLabel: "序号",
  111. },
  112. {
  113. columnProp: "cmcInvoice",
  114. columnLabel: "发票号",
  115. },
  116. {
  117. columnProp: "seqNo",
  118. columnLabel: "托盘号/箱号",
  119. },
  120. {
  121. columnProp: "customerPO",
  122. columnLabel: "PO",
  123. },
  124. {
  125. columnProp: "pn",
  126. columnLabel: "PN",
  127. },
  128. {
  129. columnProp: "qty",
  130. columnLabel: "数量",
  131. },
  132. {
  133. columnProp: "boxQty",
  134. columnLabel: "箱数",
  135. },
  136. {
  137. columnProp: "Rolls",
  138. columnLabel: "Rolls",
  139. },
  140. {
  141. columnProp: "pallet_qty",
  142. columnLabel: "托数",
  143. },
  144. {
  145. columnProp: "length",
  146. columnLabel: "长(M)",
  147. },
  148. {
  149. columnProp: "width",
  150. columnLabel: "宽(M)",
  151. },
  152. {
  153. columnProp: "height",
  154. columnLabel: "高(M)",
  155. },
  156. {
  157. columnProp: "volume",
  158. columnLabel: "体积",
  159. },
  160. {
  161. columnProp: "grossWeight",
  162. columnLabel: "毛重",
  163. },
  164. {
  165. columnProp: "netWeight",
  166. columnLabel: "净重",
  167. }
  168. ],
  169. }
  170. },
  171. methods: {
  172. async exportExcel() {
  173. let searchData={
  174. site: this.pageData.site,
  175. buNo: this.pageData.buNo,
  176. delNo: this.pageData.delNo,
  177. cmcInvoice: this.pageData.cmcInvoice,
  178. shippingMode: this.pageData.shippingMode,
  179. destination : this.pageData.destination,
  180. createBy: this.$store.state.user.name,
  181. }
  182. excel.exportTable({
  183. url: "/ecss/coDel/searchCoDelPalletList",
  184. columnMapping: excelOpts.PalletSku.columnMapping,//可以直接用table,不需要的列就剔除
  185. mergeSetting: [],//需要合并的列
  186. params: searchData,
  187. fileName: this.exportName+".xlsx",
  188. rowFetcher: res => res.data,
  189. columnFormatter: [],
  190. dropColumns: [],//需要剔除的列,例如dropColumns: ["netWeight"],即剔除净重列
  191. });
  192. // 导出成功后更新export_flag字段
  193. let updateData = {
  194. site: this.pageData.site,
  195. buNo: this.pageData.buNo,
  196. delNo: this.pageData.delNo,
  197. exportFlag: 'Y',
  198. updateBy: this.$store.state.user.name
  199. }
  200. updateExportFlag(updateData).then(({data}) => {
  201. if (data.code === 0) {
  202. console.info('更新成功:');
  203. }
  204. }).catch(error => {
  205. this.$message.warning('导出成功,但更新导出状态失败');
  206. console.error('更新导出状态失败:', error);
  207. });
  208. },
  209. // 初始化组件的参数
  210. init (inData) {
  211. this.fileList = []
  212. this.palletRecords = [] // 重置栈板记录
  213. let tempData = {
  214. username: this.$store.state.user.name,
  215. }
  216. getBuList(tempData).then(({data}) => {
  217. if (data.code === 0) {
  218. this.buList = data.row2
  219. }
  220. })
  221. console.log(inData)
  222. this.pageData={
  223. site: inData.site,
  224. buNo: inData.buNo,
  225. delNo: inData.delNo,
  226. cmcInvoice: inData.cmcInvoice,
  227. shippingMode: inData.shippingMode,
  228. destination : inData.destination,
  229. walMartOrderFlag: inData.walMartOrderFlag,
  230. createBy: this.$store.state.user.name,
  231. }
  232. // 默认根据buNo获取全部栈板
  233. this.loadAllPallets()
  234. // 打开页面
  235. this.visible = true
  236. },
  237. // 上传之前
  238. beforeUploadHandle (file) {
  239. let extName = file[0].name.substring(file[0].name.lastIndexOf('.')).toLowerCase()
  240. if (!(extName === '.xlsx' || extName === '.xls')) {
  241. this.$message.error('数据导入失败,请选择正确的xlsx模板文件')
  242. return false
  243. }
  244. },
  245. // 选择上传文件时
  246. onChange (file) {
  247. this.fileList.push(file)
  248. },
  249. // 关闭modal
  250. closeDialog () {
  251. this.deleteFile()
  252. // 关闭当前的页面
  253. this.visible = false
  254. },
  255. deleteFile(){
  256. this.fileList = []
  257. this.palletRecords = [] // 清空栈板记录
  258. // 清空文件上传记录
  259. this.$refs.uploadFile.clearFiles()
  260. // 刷新报工的页面
  261. this.$emit('refreshTable')
  262. },
  263. // 保修当前的数据
  264. saveUploadFile () {
  265. // 判断文件是否上传
  266. if (null == this.fileList || 0 === this.fileList.length) {
  267. this.$message.error("请先上传文件!")
  268. return false
  269. }
  270. // 过滤出托数大于0的栈板记录
  271. const validPalletRecords = this.palletRecords.filter(record => {
  272. return record.palletQty && parseFloat(record.palletQty) > 0
  273. })
  274. // 验证有效的栈板记录
  275. for (let i = 0; i < validPalletRecords.length; i++) {
  276. const record = validPalletRecords[i]
  277. if (!record.pallet) {
  278. this.$message.error(`栈板不能为空!`)
  279. return false
  280. }
  281. if (!record.height || record.height <= 0) {
  282. this.$message.error(`栈板高度必须大于0!`)
  283. return false
  284. }
  285. }
  286. this.saveLoading = true
  287. const formData = new FormData()
  288. formData.append("buNo",this.pageData.buNo)
  289. formData.append("site",this.pageData.site)
  290. formData.append("delNo",this.pageData.delNo)
  291. formData.append("cmcInvoice",this.pageData.cmcInvoice)
  292. formData.append("walMartOrderFlag",this.pageData.walMartOrderFlag)
  293. formData.append("username",this.$store.state.user.name)
  294. formData.append("file", this.fileList[0].raw)
  295. // 只添加托数大于0的栈板记录数据
  296. formData.append("palletRecords", JSON.stringify(validPalletRecords))
  297. // formData.append("createBy", this.pageData.createBy)
  298. saveCoDelPalletDataByExcel(formData).then(({data}) => {
  299. if (data.code === 0) {
  300. this.$message.success(data.msg)
  301. // 关闭窗口并刷新页面
  302. this.closeDialog()
  303. } else {
  304. this.$alert(data.msg, '错误', {
  305. confirmButtonText: '确定'
  306. })
  307. this.deleteFile()
  308. }
  309. }).catch((error) => {
  310. console.error('保存失败:', error)
  311. this.$message.error('保存失败,请重试')
  312. }).finally(() => {
  313. this.saveLoading = false
  314. })
  315. },
  316. // 下载
  317. async downloadFile () {
  318. let file = {
  319. id: 0,
  320. fileName: ''
  321. }
  322. let tempData = {
  323. orderRef1: 'ecss',
  324. orderRef2: 'upLoadPallet'
  325. }
  326. await queryFileId(tempData).then(({data}) => {
  327. if (data && data.code === 0) {
  328. file.id = data.data.id
  329. file.fileName = data.data.fileName
  330. } else {
  331. this.$alert(data.msg, '错误', {
  332. confirmButtonText: '确定'
  333. })
  334. }
  335. })
  336. await downLoadObjectFile(file).then(({data}) => {
  337. // 不限制文件下载类型
  338. const blob = new Blob([data], {type: "application/octet-stream"})
  339. // 下载文件名称
  340. const fileName = file.fileName
  341. // a标签下载
  342. const linkNode = document.createElement('a')
  343. // a标签的download属性规定下载文件的名称
  344. linkNode.download = fileName
  345. linkNode.style.display = 'none'
  346. // 生成一个Blob URL
  347. linkNode.href = URL.createObjectURL(blob)
  348. document.body.appendChild(linkNode)
  349. // 模拟在按钮上的一次鼠标单击
  350. linkNode.click()
  351. // 释放URL 对象
  352. URL.revokeObjectURL(linkNode.href)
  353. document.body.removeChild(linkNode)
  354. })
  355. },
  356. //导出excel
  357. async createExportData() {
  358. let searchData={
  359. site: this.pageData.site,
  360. buNo: this.pageData.buNo,
  361. delNo: this.pageData.delNo,
  362. cmcInvoice: this.pageData.cmcInvoice,
  363. createBy: this.$store.state.user.name,
  364. }
  365. await searchEcssCoDelNotifyDetail(searchData).then(({data}) => {
  366. this.exportList= data.rows
  367. this.exportList.forEach(o => o.cmcInvoice=this.pageData.cmcInvoice);
  368. })
  369. return this.exportList;
  370. },
  371. startDownload() {
  372. // this.exportData = this.dataList
  373. },
  374. finishDownload() {
  375. },
  376. fields() {
  377. let json = "{"
  378. this.columnList1.forEach((item, index) => {
  379. if (index == this.columnList1.length - 1) {
  380. json += "\"" + item.columnLabel + "\"" + ":" + "\"" + item.columnProp + "\""
  381. } else {
  382. json += "\"" + item.columnLabel + "\"" + ":" + "\"" + item.columnProp + "\"" + ","
  383. }
  384. })
  385. json += "}"
  386. let s = eval("(" + json + ")")
  387. return s
  388. },
  389. // 根据buNo加载全部栈板
  390. loadAllPallets() {
  391. let searchData = {
  392. palletType: '', // 不限制栈板类型,获取全部
  393. buNo: this.pageData.buNo
  394. }
  395. searchPalletList(searchData).then(({data}) => {
  396. if (data.code === 0) {
  397. const pallets = data.rows || []
  398. // 为每个栈板创建一条记录
  399. this.palletRecords = pallets.map(pallet => ({
  400. pallet: pallet.palletNo,
  401. palletType: pallet.palletType,
  402. palletQty: '', // 默认为空,用户需要输入
  403. height: '' // 使用栈板的默认高度
  404. }))
  405. }
  406. }).catch(error => {
  407. console.error('加载栈板列表失败:', error)
  408. // 如果加载失败,至少添加一行空记录
  409. this.palletRecords = [{
  410. pallet: '',
  411. palletType: '',
  412. palletQty: '',
  413. height: ''
  414. }]
  415. })
  416. },
  417. }
  418. }
  419. </script>
  420. <style scoped>
  421. /deep/ .zxClass .cell {
  422. line-height: 24px;
  423. font-size: 12px;
  424. height: 24px;
  425. }
  426. </style>