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.

1899 lines
57 KiB

5 months ago
5 months ago
5 months ago
5 months ago
5 months ago
5 months ago
5 months ago
5 months ago
1 month ago
5 months ago
1 month ago
5 months ago
1 month ago
5 months ago
1 month ago
5 months ago
5 months ago
5 months ago
5 months ago
5 months ago
1 month ago
5 months ago
1 month ago
5 months ago
1 month ago
5 months ago
5 months ago
5 months ago
5 months ago
1 month ago
5 months ago
5 months ago
5 months ago
5 months ago
5 months ago
5 months ago
5 months ago
5 months ago
5 months ago
5 months ago
5 months ago
5 months ago
5 months ago
5 months ago
5 months ago
5 months ago
5 months ago
3 months ago
5 months ago
5 months ago
5 months ago
5 months ago
5 months ago
5 months ago
5 months ago
5 months ago
5 months ago
5 months ago
5 months ago
5 months ago
5 months ago
5 months ago
5 months ago
5 months ago
5 months ago
5 months ago
5 months ago
5 months ago
5 months ago
5 months ago
5 months ago
5 months ago
5 months ago
5 months ago
5 months ago
5 months ago
5 months ago
5 months ago
5 months ago
5 months ago
5 months ago
5 months ago
5 months ago
5 months ago
5 months ago
5 months ago
5 months ago
5 months ago
5 months ago
5 months ago
5 months ago
5 months ago
5 months ago
5 months ago
5 months ago
5 months ago
5 months ago
5 months ago
5 months ago
5 months ago
5 months ago
5 months ago
5 months ago
5 months ago
5 months ago
5 months ago
5 months ago
5 months ago
5 months ago
5 months ago
5 months ago
5 months ago
5 months ago
5 months ago
5 months ago
5 months ago
  1. <template>
  2. <div class="mod-config">
  3. <!-- 条件查询 -->
  4. <el-card :class="['search-card', { 'collapsed': !searchExpanded }]" shadow="hover">
  5. <div slot="header" class="search-header">
  6. <div class="header-left">
  7. <i class="el-icon-search"></i>
  8. <span class="header-title">查询条件</span>
  9. </div>
  10. <div class="header-right">
  11. <el-button
  12. type="text"
  13. size="small"
  14. @click="toggleSearchExpand"
  15. class="collapse-btn">
  16. <span>{{ searchExpanded ? '收起' : '展开' }}</span>
  17. <i :class="searchExpanded ? 'el-icon-arrow-up' : 'el-icon-arrow-down'"></i>
  18. </el-button>
  19. </div>
  20. </div>
  21. <el-form
  22. :inline="true"
  23. label-position="top"
  24. :model="searchData"
  25. class="search-form"
  26. @keyup.enter.native="getMainData">
  27. <!-- 查询条件 - 可展开/收起 -->
  28. <template v-if="searchExpanded">
  29. <!-- 第一行 -->
  30. <el-row :gutter="16">
  31. <el-col :span="4">
  32. <el-form-item label="物料编码">
  33. <el-input v-model="searchData.partNo" placeholder="请输入物料编码" clearable></el-input>
  34. </el-form-item>
  35. </el-col>
  36. <el-col :span="5">
  37. <el-form-item label="物料名称">
  38. <el-input v-model="searchData.partDesc" placeholder="请输入物料名称" clearable></el-input>
  39. </el-form-item>
  40. </el-col>
  41. <el-col :span="5">
  42. <el-form-item label="规格型号">
  43. <el-input v-model="searchData.spec" placeholder="请输入规格型号" clearable></el-input>
  44. </el-form-item>
  45. </el-col>
  46. <el-col :span="5">
  47. <el-form-item label="通知单号">
  48. <el-input v-model="searchData.notifyNo" placeholder="请输入通知单号" clearable></el-input>
  49. </el-form-item>
  50. </el-col>
  51. <el-col :span="5">
  52. <el-form-item label="检验单号">
  53. <el-input v-model="searchData.orderNo" placeholder="请输入检验单号" clearable></el-input>
  54. </el-form-item>
  55. </el-col>
  56. </el-row>
  57. <!-- 第二行 -->
  58. <el-row :gutter="16">
  59. <el-col :span="4">
  60. <el-form-item label="采购单号">
  61. <el-input v-model="searchData.poOrderNo" placeholder="请输入采购单号" clearable></el-input>
  62. </el-form-item>
  63. </el-col>
  64. <el-col :span="4">
  65. <el-form-item label="采购单行号">
  66. <el-input v-model="searchData.poItemNo" placeholder="请输入行号" clearable></el-input>
  67. </el-form-item>
  68. </el-col>
  69. <el-col :span="4">
  70. <el-form-item label="单据状态">
  71. <el-select v-model="searchData.orderStatus" clearable placeholder="请选择状态">
  72. <el-option label="待入库" value="待入库"></el-option>
  73. <el-option label="已完成" value="已完成"></el-option>
  74. </el-select>
  75. </el-form-item>
  76. </el-col>
  77. <el-col :span="8">
  78. <el-form-item label="检验日期">
  79. <el-date-picker
  80. v-model="searchData.startDate"
  81. type="date"
  82. value-format="yyyy-MM-dd"
  83. placeholder="开始日期"
  84. style="width: 45%"
  85. clearable>
  86. </el-date-picker>
  87. <span style="margin: 0 6px; color: #DCDFE6;">~</span>
  88. <el-date-picker
  89. v-model="searchData.endDate"
  90. type="date"
  91. value-format="yyyy-MM-dd"
  92. placeholder="结束日期"
  93. style="width: 45%"
  94. clearable>
  95. </el-date-picker>
  96. </el-form-item>
  97. </el-col>
  98. </el-row>
  99. </template>
  100. <!-- 按钮行 - 始终显示 -->
  101. <el-row :gutter="16">
  102. <el-col :span="24">
  103. <div class="search-actions">
  104. <div class="action-left">
  105. <el-button
  106. type="primary"
  107. icon="el-icon-search"
  108. @click="getMainData">
  109. 查询
  110. </el-button>
  111. <el-button
  112. icon="el-icon-refresh-left"
  113. @click="resetSearch">
  114. 重置
  115. </el-button>
  116. </div>
  117. <div class="action-right">
  118. <el-button
  119. type="primary"
  120. icon="el-icon-download"
  121. @click="exportExcel()">
  122. 导出
  123. </el-button>
  124. </div>
  125. </div>
  126. </el-col>
  127. </el-row>
  128. </el-form>
  129. </el-card>
  130. <el-table
  131. :height="height"
  132. :data="mainDataList"
  133. border
  134. ref="mainTable"
  135. highlight-current-row
  136. @row-click="changeData"
  137. v-loading="dataListLoading"
  138. style="margin-top: 0px; width: 100%;">
  139. <el-table-column
  140. header-align="center"
  141. align="center"
  142. width="100"
  143. label="操作">
  144. <template slot-scope="scope">
  145. <a type="text" size="small" @click="addOrUpdateHandle(scope.row)">生成标签</a>
  146. </template>
  147. </el-table-column>
  148. <el-table-column
  149. v-for="(item,index) in columnArray1" :key="index"
  150. :sortable="item.columnSortable"
  151. :prop="item.columnProp"
  152. :header-align="item.headerAlign"
  153. :show-overflow-tooltip="item.showOverflowTooltip"
  154. :align="item.align"
  155. :fixed="item.fixed==''?false:item.fixed"
  156. :min-width="item.columnWidth"
  157. :label="item.columnLabel">
  158. <template slot-scope="scope">
  159. <span v-if="!item.columnHidden"> {{scope.row[item.columnProp]}}</span>
  160. <span v-if="item.columnImage"><img :src="scope.row[item.columnProp]"
  161. style="width: 100px; height: 80px"/></span>
  162. </template>
  163. </el-table-column>
  164. </el-table>
  165. <el-pagination style="margin-top: 0px"
  166. @size-change="sizeChangeHandle"
  167. @current-change="currentChangeHandle"
  168. :current-page="pageIndex"
  169. :page-sizes="[20, 50, 100, 200, 500]"
  170. :page-size="pageSize"
  171. :total="totalPage"
  172. layout="total, sizes, prev, pager, next, jumper">
  173. </el-pagination>
  174. <el-form :inline="true" label-position="top" label-width="100px" style="margin-top: 0px;" >
  175. <el-form-item >
  176. <el-button type="primary" @click="printLabels" style="">打印</el-button>
  177. <el-button @click="deleteLabels()" type="primary" style="margin-left: 2px">删除</el-button>
  178. <el-button type="primary" icon="el-icon-upload" @click="openUpload()" style="margin-left: 2px">导入</el-button>
  179. </el-form-item>
  180. </el-form>
  181. <el-table
  182. :height="height"
  183. :data="table2List"
  184. border
  185. ref="table3"
  186. highlight-current-row
  187. @selection-change="handleSelectionChange"
  188. v-loading="dataListLoading"
  189. style="margin-top: 0px; width: 100%;">
  190. <el-table-column
  191. type="selection"
  192. width="55"
  193. align="center">
  194. </el-table-column>
  195. <el-table-column
  196. v-for="(item,index) in columnArray2" :key="index"
  197. :sortable="item.columnSortable"
  198. :prop="item.columnProp"
  199. :header-align="item.headerAlign"
  200. :show-overflow-tooltip="item.showOverflowTooltip"
  201. :align="item.align"
  202. :fixed="item.fixed==''?false:item.fixed"
  203. :min-width="item.columnWidth"
  204. :label="item.columnLabel">
  205. <template slot-scope="scope">
  206. <span v-if="!item.columnHidden"> {{scope.row[item.columnProp]}}</span>
  207. <span v-if="item.columnImage"><img :src="scope.row[item.columnProp]"
  208. style="width: 100px; height: 80px"/></span>
  209. </template>
  210. </el-table-column>
  211. </el-table>
  212. <el-dialog title="标签发行" :close-on-click-modal="false" v-drag :visible.sync="addModelFlag" width="800px">
  213. <el-form :model="addModelData" label-position="top" style="margin-top: -5px;">
  214. <el-row :gutter="20">
  215. <el-col :span="8">
  216. <el-form-item label="物料编码" >
  217. <el-input v-model="addModelData.partNo" disabled style="width: 100%"></el-input>
  218. </el-form-item>
  219. </el-col>
  220. <el-col :span="16">
  221. <el-form-item label="物料名称" >
  222. <el-input v-model="addModelData.partDesc" disabled style="width: 100%"></el-input>
  223. </el-form-item>
  224. </el-col>
  225. <el-col :span="8">
  226. <el-form-item label="采购订单" >
  227. <el-input v-model="addModelData.poOrderNo" disabled style="width: 100%"></el-input>
  228. </el-form-item>
  229. </el-col>
  230. <el-col :span="8">
  231. <el-form-item label="采购订单行号">
  232. <el-input v-model="addModelData.poItemNo" disabled style="width: 100%"></el-input>
  233. </el-form-item>
  234. </el-col>
  235. <el-col :span="8">
  236. <el-form-item label="检验单号">
  237. <el-input v-model="addModelData.orderNo" disabled style="width: 100%"></el-input>
  238. </el-form-item>
  239. </el-col>
  240. <el-col :span="8">
  241. <el-form-item label="本次到货数量">
  242. <el-input v-model="addModelData.orderQty" disabled style="width: 100%"></el-input>
  243. </el-form-item>
  244. </el-col>
  245. <el-col :span="8">
  246. <el-form-item label="本次到货卷数">
  247. <el-input v-model="addModelData.orderRollCount" disabled style="width: 100%"></el-input>
  248. </el-form-item>
  249. </el-col>
  250. <el-col :span="8">
  251. <el-form-item label="检验合格数量">
  252. <el-input v-model="addModelData.batchQualifiedQty" disabled style="width: 100%"></el-input>
  253. </el-form-item>
  254. </el-col>
  255. <el-col :span="4">
  256. <el-form-item label="超入比例" >
  257. <el-input v-model="addModelData.exceedInRatio" disabled style="width: 100%"></el-input>
  258. </el-form-item>
  259. </el-col>
  260. <el-col :span="4">
  261. <el-form-item label="有效期管理">
  262. <el-input v-model="addModelData.expirationFlag" disabled style="width: 100%"></el-input>
  263. </el-form-item>
  264. </el-col>
  265. <el-col :span="8">
  266. <el-form-item label="生产日期" required>
  267. <el-date-picker
  268. v-model="addModelData.productionDate"
  269. type="date"
  270. format="yyyy-MM-dd"
  271. value-format="yyyy-MM-dd"
  272. style="width: 100%">
  273. </el-date-picker>
  274. </el-form-item>
  275. </el-col>
  276. <el-col :span="8">
  277. <el-form-item label="批次号">
  278. <el-input v-model="addModelData.batchNo" style="width: 100%"></el-input>
  279. </el-form-item>
  280. </el-col>
  281. <el-col :span="8">
  282. <el-form-item label="发行张数" required>
  283. <el-input v-model="addModelData.rollCount" @blur="getNowRollQty()" @input="handleInput" type="number" style="width: 100%"></el-input>
  284. </el-form-item>
  285. </el-col>
  286. <el-col :span="8">
  287. <el-form-item label="每张数量" required>
  288. <el-input v-model="addModelData.rollQty" @blur="getNowRollQty()" type="number" style="width: 100%"></el-input>
  289. </el-form-item>
  290. </el-col>
  291. <el-col :span="8">
  292. <el-form-item label="尾卷数量">
  293. <el-input v-model="addModelData.tailRollQty" @blur="getNowRollQty()" type="number" style="width: 100%"></el-input>
  294. </el-form-item>
  295. </el-col>
  296. <el-col :span="8">
  297. <el-form-item label="本次发行数量" >
  298. <el-input v-model="addModelData.nowRollQty" disabled style="width: 100%"></el-input>
  299. </el-form-item>
  300. </el-col>
  301. <el-col :span="8">
  302. <el-form-item label="可发行数量">
  303. <el-input v-model="addModelData.remainingIssuableQty" disabled style="width: 100%"></el-input>
  304. </el-form-item>
  305. </el-col>
  306. </el-row>
  307. </el-form>
  308. <div slot="footer" class="dialog-footer" style="text-align: center;">
  309. <el-button type="success" @click="submitDataNoClose()">应用</el-button>
  310. <el-button type="success" @click="submitData()">确定</el-button>
  311. <el-button type="primary" @click="addModelFlag=false">取消</el-button>
  312. </div>
  313. </el-dialog>
  314. <!-- 导入 -->
  315. <qcUpload ref="qcUpload" @refreshPageTables="getDetailTableList()" v-drag></qcUpload>
  316. <!-- 标签打印对话框 -->
  317. <el-dialog
  318. :close-on-click-modal="false"
  319. v-drag
  320. :visible.sync="printDialogVisible"
  321. width="650px"
  322. class="print-dialog">
  323. <div slot="title" class="dialog-title-wrapper">
  324. <i class="el-icon-printer" style="margin-right: 8px; font-size: 20px;"></i>
  325. <span style="font-size: 18px; font-weight: 600;">标签打印设置</span>
  326. </div>
  327. <div class="print-dialog-content">
  328. <!-- 打印信息提示 -->
  329. <div class="print-info-banner">
  330. <i class="el-icon-info" style="margin-right: 8px; font-size: 16px;"></i>
  331. <span>已选择 <strong style="color: #3a7ba8;">{{ selectionDataList.length }}</strong> 个标签请配置打印参数</span>
  332. </div>
  333. <el-form :model="printDialogData" label-position="top" style="margin-top: 20px;">
  334. <el-row :gutter="20">
  335. <el-col :span="12">
  336. <el-form-item required>
  337. <span slot="label" class="form-label">
  338. <i class="el-icon-document-copy" style="margin-right: 5px;"></i>
  339. 打印次数
  340. </span>
  341. <el-input-number
  342. v-model="printDialogData.printTimes"
  343. :min="1"
  344. :max="100"
  345. controls-position="right"
  346. placeholder="每个标签打印份数"
  347. style="width: 100%">
  348. </el-input-number>
  349. <div class="form-tip">设置每个标签的打印份数</div>
  350. </el-form-item>
  351. </el-col>
  352. <el-col :span="12">
  353. <el-form-item required>
  354. <span slot="label" class="form-label">
  355. <i class="el-icon-tickets" style="margin-right: 5px;"></i>
  356. 标签模板
  357. </span>
  358. <el-select
  359. v-model="printDialogData.labelNo"
  360. placeholder="请选择标签模板"
  361. style="width: 100%"
  362. :disabled="labelTemplateList.length === 0">
  363. <el-option
  364. v-for="item in labelTemplateList"
  365. :key="item.labelNo"
  366. :label="item.labelName"
  367. :value="item.labelNo">
  368. <span style="float: left">{{ item.labelName }}</span>
  369. <span style="float: right; color: #8492a6; font-size: 13px">{{ item.labelNo }}</span>
  370. </el-option>
  371. </el-select>
  372. <div class="form-tip" v-if="labelTemplateList.length === 0" style="color: #F56C6C;">
  373. 暂无可用模板
  374. </div>
  375. <div class="form-tip" v-else>
  376. 根据物料自动匹配模板
  377. </div>
  378. </el-form-item>
  379. </el-col>
  380. </el-row>
  381. <el-row>
  382. <el-col :span="24">
  383. <el-form-item required>
  384. <span slot="label" class="form-label">
  385. <i class="el-icon-printer" style="margin-right: 5px;"></i>
  386. 目标打印机
  387. </span>
  388. <el-select
  389. v-model="printDialogData.printerName"
  390. placeholder="请选择打印机"
  391. style="width: 100%"
  392. :disabled="printerList.length === 0">
  393. <el-option
  394. v-for="item in printerList"
  395. :key="item"
  396. :label="item"
  397. :value="item">
  398. <i class="el-icon-printer" style="margin-right: 8px; color: #67C23A;"></i>
  399. {{ item }}
  400. </el-option>
  401. </el-select>
  402. <div class="form-tip" v-if="printerList.length === 0" style="color: #F56C6C;">
  403. 未检测到打印机请确保已安装并启动 CLodop
  404. </div>
  405. <div class="form-tip" v-else>
  406. 已检测到 {{ printerList.length }} 台打印机
  407. </div>
  408. </el-form-item>
  409. </el-col>
  410. </el-row>
  411. <!-- 打印预览说明 -->
  412. <div class="print-summary">
  413. <div class="summary-item">
  414. <span class="summary-label">打印总数</span>
  415. <span class="summary-value">{{ selectionDataList.length * printDialogData.printTimes }} </span>
  416. </div>
  417. <div class="summary-item">
  418. <span class="summary-label">标签数量</span>
  419. <span class="summary-value">{{ selectionDataList.length }} </span>
  420. </div>
  421. <div class="summary-item">
  422. <span class="summary-label">每标签份数</span>
  423. <span class="summary-value">{{ printDialogData.printTimes }} </span>
  424. </div>
  425. </div>
  426. </el-form>
  427. </div>
  428. <div slot="footer" class="dialog-footer">
  429. <el-button
  430. type="success"
  431. icon="el-icon-printer"
  432. @click="confirmPrint()"
  433. :loading="printLoading"
  434. :disabled="!printDialogData.labelNo || !printDialogData.printerName"
  435. size="medium">
  436. {{ printLoading ? '打印中...' : '开始打印' }}
  437. </el-button>
  438. <el-button
  439. @click="printDialogVisible=false"
  440. size="medium">
  441. 取消
  442. </el-button>
  443. </div>
  444. </el-dialog>
  445. </div>
  446. </template>
  447. <script>
  448. /*组件*/
  449. import excel from "@/utils/excel-util.js";
  450. import qcUpload from "@/views/modules/qc/qc_upload";
  451. import {
  452. deletePoPartLabelData,
  453. getInboundQcResultData,
  454. getInboundQcResultOtherData,
  455. getPoOrderRollNoOutData, getPoPartLabelData,
  456. submitPoOrderRollNo,
  457. getPartLabelTemplateList,
  458. callUspPartLabelTemplate
  459. } from '../../../api/wms/wms'
  460. import {poPartLabelPrint} from '../clodopLabel/poPartLabel'
  461. import getLodop from '@/utils/LodopFuncs.js'
  462. import labelPrintTemplates from '@/mixins/labelPrintTemplates.js'
  463. export default {
  464. mixins: [labelPrintTemplates],
  465. data() {
  466. return {
  467. functionId: this.$route.meta.menuId,
  468. height: 200,
  469. currentRow: {},
  470. searchData:{
  471. site:this.$store.state.user.site,
  472. orderNo:'',
  473. notifyNo: '',
  474. partNo:'',
  475. partDesc:'',
  476. spec:'',
  477. poOrderNo:'',
  478. poItemNo:'',
  479. orderStatus:'待入库',
  480. startDate:'',
  481. endDate:'',
  482. page: 1,
  483. limit: 10,
  484. },
  485. searchExpanded: true, // 查询条件展开状态
  486. selectionDataList:[],
  487. pageIndex: 1,
  488. pageSize: 50,
  489. totalPage: 0,
  490. mainDataList:[],
  491. table2List:[],
  492. dataListLoading: false,
  493. addModelFlag:false,
  494. addModelData:{
  495. expirationWarningDay:'',
  496. site:'',
  497. buNo:'',
  498. partNo: '',
  499. partDesc: '',
  500. poOrderNo: '',
  501. poItemNo: '',
  502. orderNo: '',
  503. orderQty: '',
  504. supplierId: '',
  505. supplierName: '',
  506. orderRollCount: '',
  507. batchQualifiedQty: '',
  508. remainingIssuableQty: '',
  509. exceedInRatio: '',
  510. expirationFlag: '',
  511. expirationDay: '',
  512. nowRollQty: '',
  513. productionDate: '',
  514. batchNo: '',
  515. rollCount: '1',
  516. rollQty: '',
  517. tailRollQty: '0'
  518. },
  519. columnArray1: [
  520. {
  521. userId: this.$store.state.user.name,
  522. functionId: this.functionId,
  523. serialNumber: '670Table1BuNo',
  524. tableId: "670Table1",
  525. tableName: "采购检验合格单",
  526. columnProp: "buNo",
  527. headerAlign: "center",
  528. align: "center",
  529. columnLabel: "BU",
  530. columnWidth: '70',
  531. columnHidden: false,
  532. columnImage: false,
  533. columnSortable: false,
  534. sortLv: 0,
  535. status: true,
  536. fixed: false
  537. },
  538. {
  539. userId: this.$store.state.user.name,
  540. functionId: this.functionId,
  541. serialNumber: '670Table1NotifyNo',
  542. tableId: "670Table1",
  543. tableName: "采购检验合格单",
  544. columnProp: "notifyNo",
  545. headerAlign: "center",
  546. align: "left",
  547. columnLabel: "通知单号",
  548. columnWidth: '120',
  549. columnHidden: false,
  550. columnImage: false,
  551. columnSortable: false,
  552. sortLv: 1,
  553. status: true,
  554. fixed: false
  555. },
  556. {
  557. userId: this.$store.state.user.name,
  558. functionId: this.functionId,
  559. serialNumber: '670Table1OrderNo',
  560. tableId: "670Table1",
  561. tableName: "采购检验合格单",
  562. columnProp: "orderNo",
  563. headerAlign: "center",
  564. align: "left",
  565. columnLabel: "检验单号",
  566. columnWidth: '120',
  567. columnHidden: false,
  568. columnImage: false,
  569. columnSortable: false,
  570. sortLv: 1,
  571. status: true,
  572. fixed: false
  573. },
  574. {
  575. userId: this.$store.state.user.name,
  576. functionId: this.functionId,
  577. serialNumber: '670Table1OrderStatus',
  578. tableId: "670Table1",
  579. tableName: "采购检验合格单",
  580. columnProp: "orderStatus",
  581. headerAlign: "center",
  582. align: "center",
  583. columnLabel: "单据状态",
  584. columnWidth: '100',
  585. columnHidden: false,
  586. columnImage: false,
  587. columnSortable: false,
  588. sortLv: 2,
  589. status: true,
  590. fixed: false
  591. },
  592. {
  593. userId: this.$store.state.user.name,
  594. functionId: this.functionId,
  595. serialNumber: '670Table1PartNo',
  596. tableId: "670Table1",
  597. tableName: "采购检验合格单",
  598. columnProp: "partNo",
  599. headerAlign: "center",
  600. align: "left",
  601. columnLabel: "物料编码",
  602. columnWidth: '120',
  603. columnHidden: false,
  604. columnImage: false,
  605. columnSortable: false,
  606. sortLv: 3,
  607. status: true,
  608. fixed: false
  609. },
  610. {
  611. userId: this.$store.state.user.name,
  612. functionId: this.functionId,
  613. serialNumber: '670Table1PartDesc',
  614. tableId: "670Table1",
  615. tableName: "采购检验合格单",
  616. columnProp: "partDesc",
  617. headerAlign: "center",
  618. align: "left",
  619. columnLabel: "物料名称",
  620. columnWidth: '200',
  621. columnHidden: false,
  622. columnImage: false,
  623. columnSortable: false,
  624. sortLv: 4,
  625. status: true,
  626. fixed: false
  627. },
  628. {
  629. userId: this.$store.state.user.name,
  630. functionId: this.functionId,
  631. serialNumber: '670Table1Spec',
  632. tableId: "670Table1",
  633. tableName: "采购检验合格单",
  634. columnProp: "spec",
  635. headerAlign: "center",
  636. align: "left",
  637. columnLabel: "规格型号",
  638. columnWidth: '120',
  639. columnHidden: false,
  640. columnImage: false,
  641. columnSortable: false,
  642. sortLv: 4,
  643. status: true,
  644. fixed: false
  645. },
  646. {
  647. userId: this.$store.state.user.name,
  648. functionId: this.functionId,
  649. serialNumber: '670Table1OrderQty',
  650. tableId: "670Table1",
  651. tableName: "采购检验合格单",
  652. columnProp: "orderQty",
  653. headerAlign: "center",
  654. align: "right",
  655. columnLabel: "到货数量",
  656. columnWidth: '100',
  657. columnHidden: false,
  658. columnImage: false,
  659. columnSortable: false,
  660. sortLv: 10,
  661. status: true,
  662. fixed: false
  663. },
  664. {
  665. userId: this.$store.state.user.name,
  666. functionId: this.functionId,
  667. serialNumber: '670Table1RollCount',
  668. tableId: "670Table1",
  669. tableName: "采购检验合格单",
  670. columnProp: "rollCount",
  671. headerAlign: "center",
  672. align: "right",
  673. columnLabel: "到货卷数",
  674. columnWidth: '100',
  675. columnHidden: false,
  676. columnImage: false,
  677. columnSortable: false,
  678. sortLv: 11,
  679. status: true,
  680. fixed: false
  681. },
  682. {
  683. userId: this.$store.state.user.name,
  684. functionId: this.functionId,
  685. serialNumber: '670Table1BatchQualifiedQty',
  686. tableId: "670Table1",
  687. tableName: "采购检验合格单",
  688. columnProp: "batchQualifiedQty",
  689. headerAlign: "center",
  690. align: "right",
  691. columnLabel: "允许入库数",
  692. columnWidth: '100',
  693. columnHidden: false,
  694. columnImage: false,
  695. columnSortable: false,
  696. sortLv: 14,
  697. status: true,
  698. fixed: false
  699. },
  700. {
  701. userId: this.$store.state.user.name,
  702. functionId: this.functionId,
  703. serialNumber: '670Table1PoOrderNo',
  704. tableId: "670Table1",
  705. tableName: "采购检验合格单",
  706. columnProp: "poOrderNo",
  707. headerAlign: "center",
  708. align: "left",
  709. columnLabel: "采购订单号",
  710. columnWidth: '120',
  711. columnHidden: false,
  712. columnImage: false,
  713. columnSortable: false,
  714. sortLv: 5,
  715. status: true,
  716. fixed: false
  717. },
  718. {
  719. userId: this.$store.state.user.name,
  720. functionId: this.functionId,
  721. serialNumber: '670Table1PoItemNo',
  722. tableId: "670Table1",
  723. tableName: "采购检验合格单",
  724. columnProp: "poItemNo",
  725. headerAlign: "center",
  726. align: "center",
  727. columnLabel: "行号",
  728. columnWidth: '80',
  729. columnHidden: false,
  730. columnImage: false,
  731. columnSortable: false,
  732. sortLv: 6,
  733. status: true,
  734. fixed: false
  735. },
  736. {
  737. userId: this.$store.state.user.name,
  738. functionId: this.functionId,
  739. serialNumber: '670Table1SupplierName',
  740. tableId: "670Table1",
  741. tableName: "采购检验合格单",
  742. columnProp: "supplierName",
  743. headerAlign: "center",
  744. align: "left",
  745. columnLabel: "供应商",
  746. columnWidth: '120',
  747. columnHidden: false,
  748. columnImage: false,
  749. columnSortable: false,
  750. sortLv: 7,
  751. status: true,
  752. fixed: false
  753. },
  754. {
  755. userId: this.$store.state.user.name,
  756. functionId: this.functionId,
  757. serialNumber: '670Table1InspectorDate',
  758. tableId: "670Table1",
  759. tableName: "采购检验合格单",
  760. columnProp: "inspectorDate",
  761. headerAlign: "center",
  762. align: "center",
  763. columnLabel: "检验日期",
  764. columnWidth: '100',
  765. columnHidden: false,
  766. columnImage: false,
  767. columnSortable: false,
  768. sortLv: 8,
  769. status: true,
  770. fixed: false
  771. },
  772. {
  773. userId: this.$store.state.user.name,
  774. functionId: this.functionId,
  775. serialNumber: '670Table1InspectorNo',
  776. tableId: "670Table1",
  777. tableName: "采购检验合格单",
  778. columnProp: "inspectorNo",
  779. headerAlign: "center",
  780. align: "left",
  781. columnLabel: "检验员",
  782. columnWidth: '100',
  783. columnHidden: false,
  784. columnImage: false,
  785. columnSortable: false,
  786. sortLv: 9,
  787. status: true,
  788. fixed: false
  789. },
  790. {
  791. userId: this.$store.state.user.name,
  792. functionId: this.functionId,
  793. serialNumber: '670Table1InspectionResult',
  794. tableId: "670Table1",
  795. tableName: "采购检验合格单",
  796. columnProp: "inspectionResult",
  797. headerAlign: "center",
  798. align: "center",
  799. columnLabel: "检验结论",
  800. columnWidth: '100',
  801. columnHidden: false,
  802. columnImage: false,
  803. columnSortable: false,
  804. sortLv: 12,
  805. status: true,
  806. fixed: false
  807. },
  808. {
  809. userId: this.$store.state.user.name,
  810. functionId: this.functionId,
  811. serialNumber: '670Table1DisposalMeasures',
  812. tableId: "670Table1",
  813. tableName: "采购检验合格单",
  814. columnProp: "disposalMeasures",
  815. headerAlign: "center",
  816. align: "left",
  817. columnLabel: "处置措施",
  818. columnWidth: '120',
  819. columnHidden: false,
  820. columnImage: false,
  821. columnSortable: false,
  822. sortLv: 13,
  823. status: true,
  824. fixed: false
  825. },
  826. ],
  827. columnArray2: [
  828. {
  829. userId: this.$store.state.user.name,
  830. functionId: this.functionId,
  831. serialNumber: '670Table2OrderId',
  832. tableId: "670Table2",
  833. tableName: "采购物料标签清单",
  834. columnProp: "orderId",
  835. headerAlign: "center",
  836. align: "right",
  837. columnLabel: "No .",
  838. columnWidth: '50',
  839. columnHidden: false,
  840. columnImage: false,
  841. columnSortable: false,
  842. sortLv: 0,
  843. status: true,
  844. fixed: false
  845. },
  846. {
  847. userId: this.$store.state.user.name,
  848. functionId: this.functionId,
  849. serialNumber: '670Table2RollNo',
  850. tableId: "670Table2",
  851. tableName: "采购物料标签清单",
  852. columnProp: "rollNo",
  853. headerAlign: "center",
  854. align: "left",
  855. columnLabel: "标签条码",
  856. columnWidth: '150',
  857. columnHidden: false,
  858. columnImage: false,
  859. columnSortable: false,
  860. sortLv: 1,
  861. status: true,
  862. fixed: false
  863. },
  864. {
  865. userId: this.$store.state.user.name,
  866. functionId: this.functionId,
  867. serialNumber: '670Table2RollQty',
  868. tableId: "670Table2",
  869. tableName: "采购物料标签清单",
  870. columnProp: "rollQty",
  871. headerAlign: "center",
  872. align: "right",
  873. columnLabel: "标签数量",
  874. columnWidth: '100',
  875. columnHidden: false,
  876. columnImage: false,
  877. columnSortable: false,
  878. sortLv: 2,
  879. status: true,
  880. fixed: false
  881. },
  882. {
  883. userId: this.$store.state.user.name,
  884. functionId: this.functionId,
  885. serialNumber: '670Table2HardtagInFlag',
  886. tableId: "670Table2",
  887. tableName: "采购物料标签清单",
  888. columnProp: "hardtagInFlag",
  889. headerAlign: "center",
  890. align: "center",
  891. columnLabel: "标签状态",
  892. columnWidth: '100',
  893. columnHidden: false,
  894. columnImage: false,
  895. columnSortable: false,
  896. sortLv: 3,
  897. status: true,
  898. fixed: false
  899. },
  900. {
  901. userId: this.$store.state.user.name,
  902. functionId: this.functionId,
  903. serialNumber: '670Table2PrintFla',
  904. tableId: "670Table2",
  905. tableName: "采购物料标签清单",
  906. columnProp: "printFlag",
  907. headerAlign: "center",
  908. align: "right",
  909. columnLabel: "打印次数",
  910. columnWidth: '100',
  911. columnHidden: false,
  912. columnImage: false,
  913. columnSortable: false,
  914. sortLv: 4,
  915. status: true,
  916. fixed: false
  917. },
  918. {
  919. userId: this.$store.state.user.name,
  920. functionId: this.functionId,
  921. serialNumber: '670Table2BatchNo',
  922. tableId: "670Table2",
  923. tableName: "采购物料标签清单",
  924. columnProp: "batchNo",
  925. headerAlign: "center",
  926. align: "center",
  927. columnLabel: "批次号",
  928. columnWidth: '120',
  929. columnHidden: false,
  930. columnImage: false,
  931. columnSortable: false,
  932. sortLv: 6,
  933. status: true,
  934. fixed: false
  935. },
  936. {
  937. userId: this.$store.state.user.name,
  938. functionId: this.functionId,
  939. serialNumber: '670Table2ProductionDate',
  940. tableId: "670Table2",
  941. tableName: "采购物料标签清单",
  942. columnProp: "productionDate",
  943. headerAlign: "center",
  944. align: "center",
  945. columnLabel: "生产日期",
  946. columnWidth: '120',
  947. columnHidden: false,
  948. columnImage: false,
  949. columnSortable: false,
  950. sortLv: 6,
  951. status: true,
  952. fixed: false
  953. },
  954. {
  955. userId: this.$store.state.user.name,
  956. functionId: this.functionId,
  957. serialNumber: '670Table2ExpirationDate',
  958. tableId: "670Table2",
  959. tableName: "采购物料标签清单",
  960. columnProp: "expirationDate",
  961. headerAlign: "center",
  962. align: "center",
  963. columnLabel: "失效日期",
  964. columnWidth: '120',
  965. columnHidden: false,
  966. columnImage: false,
  967. columnSortable: false,
  968. sortLv: 6,
  969. status: true,
  970. fixed: false
  971. },
  972. {
  973. userId: this.$store.state.user.name,
  974. functionId: this.functionId,
  975. serialNumber: '670Table2ExpirationWarningDate',
  976. tableId: "670Table2",
  977. tableName: "采购物料标签清单",
  978. columnProp: "expirationWarningDate",
  979. headerAlign: "center",
  980. align: "center",
  981. columnLabel: "失效预警日期",
  982. columnWidth: '120',
  983. columnHidden: false,
  984. columnImage: false,
  985. columnSortable: false,
  986. sortLv: 6,
  987. status: true,
  988. fixed: false
  989. },
  990. {
  991. userId: this.$store.state.user.name,
  992. functionId: this.functionId,
  993. serialNumber: '670Table2OCreatedBy',
  994. tableId: "670Table2",
  995. tableName: "采购物料标签清单",
  996. columnProp: "createdBy",
  997. headerAlign: "center",
  998. align: "left",
  999. columnLabel: "操作员",
  1000. columnWidth: '100',
  1001. columnHidden: false,
  1002. columnImage: false,
  1003. columnSortable: false,
  1004. sortLv: 7,
  1005. status: true,
  1006. fixed: false
  1007. }
  1008. ],
  1009. exportName: '采购检验合格单'+this.dayjs().format('YYYYMMDDHHmmss'),
  1010. exportName2: '采购物料标签清单'+this.dayjs().format('YYYYMMDDHHmmss'),
  1011. // 标签打印对话框相关
  1012. printDialogVisible: false,
  1013. printDialogData: {
  1014. printTimes: 1,
  1015. labelNo: '',
  1016. printerName: ''
  1017. },
  1018. labelTemplateList: [],
  1019. printerList: [],
  1020. printLoading: false
  1021. }
  1022. },
  1023. /*组件*/
  1024. components: {
  1025. excel,
  1026. qcUpload,
  1027. },
  1028. mounted() {
  1029. this.$nextTick(() => {
  1030. this.height = ( window.innerHeight - 220)/2 - 25;
  1031. })
  1032. },
  1033. methods: {
  1034. // 切换查询条件展开/收起
  1035. toggleSearchExpand() {
  1036. this.searchExpanded = !this.searchExpanded
  1037. },
  1038. // 重置查询条件
  1039. resetSearch() {
  1040. this.searchData = {
  1041. site: this.$store.state.user.site,
  1042. orderNo: '',
  1043. notifyNo: '',
  1044. partNo: '',
  1045. partDesc: '',
  1046. spec: '',
  1047. poOrderNo: '',
  1048. poItemNo: '',
  1049. orderStatus: '待入库',
  1050. startDate: '',
  1051. endDate: '',
  1052. page: 1,
  1053. limit: 10,
  1054. }
  1055. this.pageIndex = 1
  1056. this.getMainData()
  1057. },
  1058. getMainData(){
  1059. this.searchData.limit = this.pageSize
  1060. this.searchData.page = this.pageIndex
  1061. getInboundQcResultData(this.searchData).then(({data}) => {
  1062. if (data.code === 0) {
  1063. this.mainDataList = data.page.list
  1064. this.pageIndex = data.page.currPage
  1065. this.pageSize = data.page.pageSize
  1066. this.totalPage = data.page.totalCount
  1067. //判断是否全部存在数据
  1068. if (this.totalPage > 0) {
  1069. //设置选中行
  1070. this.$refs.mainTable.setCurrentRow(this.mainDataList[0])
  1071. this.changeData(this.mainDataList[0])
  1072. }else {
  1073. this.changeData(null)
  1074. }
  1075. }
  1076. this.dataListLoading = false
  1077. })
  1078. },
  1079. // 每页数
  1080. sizeChangeHandle (val) {
  1081. this.pageSize = val
  1082. this.pageIndex = 1
  1083. this.getMainData()
  1084. },
  1085. // 当前页
  1086. currentChangeHandle (val) {
  1087. this.pageIndex = val
  1088. this.getMainData()
  1089. },
  1090. async exportExcel() {
  1091. this.searchData.limit = -1
  1092. this.searchData.page = 1
  1093. excel.exportTable({
  1094. url: "/wmsPrint/getInboundQcResultData",
  1095. columnMapping: this.columnArray1,//可以直接用table,不需要的列就剔除
  1096. mergeSetting: [],//需要合并的列
  1097. params: this.searchData,
  1098. fileName: this.exportName+".xlsx",
  1099. rowFetcher: res => res.data,
  1100. columnFormatter: [],
  1101. dropColumns: [],//需要剔除的列,例如dropColumns: ["netWeight"],即剔除净重列
  1102. });
  1103. },
  1104. changeData(row){
  1105. this.currentRow=JSON.parse(JSON.stringify(row))
  1106. // let inData={
  1107. // site:this.currentRow.site,
  1108. // buNo:this.currentRow.buNo,
  1109. // inspectionNo:this.currentRow.orderNo,
  1110. // }
  1111. // getPoOrderRollNoOutData(inData).then(({data}) => {
  1112. // //区分请求成功和失败的状况
  1113. // if (data && data.code == 0) {
  1114. // this.table2List = data.rows
  1115. //
  1116. // } else {
  1117. // this.table2List = [];
  1118. // }
  1119. // });
  1120. this.getDetailTableList();
  1121. },
  1122. getDetailTableList () {
  1123. let inData={
  1124. site:this.currentRow.site,
  1125. buNo:this.currentRow.buNo,
  1126. inspectionNo:this.currentRow.orderNo,
  1127. }
  1128. getPoOrderRollNoOutData(inData).then(({data}) => {
  1129. //区分请求成功和失败的状况
  1130. if (data && data.code == 0) {
  1131. this.table2List = data.rows
  1132. } else {
  1133. this.table2List = [];
  1134. }
  1135. });
  1136. },
  1137. handleSelectionChange(val){
  1138. this.selectionDataList = val
  1139. console.log(this.selectionDataList)
  1140. },
  1141. addOrUpdateHandle(row) {
  1142. getInboundQcResultOtherData(row).then(({data}) => {
  1143. //区分请求成功和失败的状况
  1144. if (data && data.code=== 0) {
  1145. let outData = data.row
  1146. console.log(data.row);
  1147. this.addModelData={
  1148. site:row.site,
  1149. buNo:row.buNo,
  1150. partNo: row.partNo,
  1151. partDesc: row.partDesc,
  1152. poOrderNo: row.poOrderNo,
  1153. poItemNo: row.poItemNo,
  1154. orderNo: row.orderNo,
  1155. orderQty: row.orderQty,
  1156. supplierId: row.supplierId,
  1157. supplierName: row.supplierName,
  1158. orderRollCount: row.rollCount,
  1159. batchQualifiedQty: row.batchQualifiedQty,
  1160. remainingIssuableQty: outData.remainingIssuableQty,
  1161. exceedInRatio: outData.exceedInRatio,
  1162. expirationFlag: outData.expirationFlag,
  1163. expirationDay:outData.expirationDay?Number(outData.expirationDay):0,
  1164. nowRollQty: row.rollQty,
  1165. productionDate: this.dayjs().format("YYYY-MM-DD"),
  1166. batchNo: '',
  1167. rollCount: '1',
  1168. rollQty: row.rollQty,
  1169. expirationWarningDay: outData.expirationWarningDay,
  1170. tailRollQty: '0'
  1171. }
  1172. if(this.addModelData.exceedInRatio==""||this.addModelData.exceedInRatio==null){
  1173. this.addModelData.exceedInRatio=0
  1174. }
  1175. }
  1176. });
  1177. this.addModelFlag = true;
  1178. },
  1179. submitData() {
  1180. // 验证必填字段
  1181. if (!this.addModelData.productionDate||this.addModelData.productionDate==='') {
  1182. this.$message.error('请选择生产日期');
  1183. return;
  1184. }
  1185. if (!this.addModelData.rollCount||this.addModelData.rollCount==='') {
  1186. this.$message.error('请输入发行张数');
  1187. return;
  1188. }
  1189. if (!this.addModelData.rollQty||this.addModelData.rollQty==='') {
  1190. this.$message.error('请输入每张数量');
  1191. return;
  1192. }
  1193. if ( this.addModelData.nowRollQty>Number(this.addModelData.remainingIssuableQty)+((Number(this.addModelData.exceedInRatio)*Number(this.addModelData.orderQty))/100)) {
  1194. this.$message.error('本次发行数量大于剩余可发行数量和超入数量');
  1195. return;
  1196. }
  1197. // 这里可以添加提交逻辑
  1198. submitPoOrderRollNo(this.addModelData).then(({data}) => {
  1199. if (data && data.code === 0) {
  1200. this.$message.success( '操作成功')
  1201. this.changeData(this.currentRow);
  1202. this.addModelFlag = false;
  1203. }else {
  1204. this.$message.error(data.msg);
  1205. }
  1206. })
  1207. },
  1208. submitDataNoClose() {
  1209. // 验证必填字段
  1210. if (!this.addModelData.productionDate||this.addModelData.productionDate==='') {
  1211. this.$message.error('请选择生产日期');
  1212. return;
  1213. }
  1214. if (!this.addModelData.rollCount||this.addModelData.rollCount==='') {
  1215. this.$message.error('请输入发行张数');
  1216. return;
  1217. }
  1218. if (!this.addModelData.rollQty||this.addModelData.rollQty==='') {
  1219. this.$message.error('请输入每张数量');
  1220. return;
  1221. }
  1222. if ( this.addModelData.nowRollQty>Number(this.addModelData.remainingIssuableQty)+((Number(this.addModelData.exceedInRatio)*Number(this.addModelData.orderQty))/100)) {
  1223. this.$message.error('本次发行数量大于剩余可发行数量和超入数量');
  1224. return;
  1225. }
  1226. // 这里可以添加提交逻辑
  1227. submitPoOrderRollNo(this.addModelData).then(({data}) => {
  1228. if (data && data.code === 0) {
  1229. this.$message.success( '操作成功')
  1230. this.changeData(this.currentRow);
  1231. let row=this.currentRow;
  1232. getInboundQcResultOtherData(row).then(({data}) => {
  1233. //区分请求成功和失败的状况
  1234. if (data && data.code=== 0) {
  1235. let outData = data.row
  1236. console.log(data.row);
  1237. this.addModelData.remainingIssuableQty= outData.remainingIssuableQty
  1238. }
  1239. });
  1240. }else {
  1241. this.$message.error(data.msg);
  1242. }
  1243. })
  1244. },
  1245. getNowRollQty(){
  1246. if(this.addModelData.tailRollQty==''||this.addModelData.tailRollQty==null||this.addModelData.tailRollQty<0){
  1247. this.addModelData.tailRollQty=0
  1248. }
  1249. if(this.addModelData.tailRollQty==0){
  1250. this.addModelData.nowRollQty=Number(this.addModelData.rollQty)*Number(this.addModelData.rollCount)
  1251. }else {
  1252. this.addModelData.nowRollQty=Number(this.addModelData.rollQty)*(Number(this.addModelData.rollCount)-1)+Number(this.addModelData.tailRollQty)
  1253. }
  1254. },
  1255. handleInput(value) {
  1256. // 1. 只保留数字
  1257. value = value.replace(/\D/g, '')
  1258. // 2. 去除前导零(0, 00, 0123 → 123)
  1259. value = value.replace(/^0+/, '')
  1260. // 3. 更新数据(触发 Vue 响应式)
  1261. this.addModelData.rollCount = value
  1262. },
  1263. async printLabels(){
  1264. if(this.selectionDataList.length===0){
  1265. this.$message.error('未选择标签!');
  1266. return false;
  1267. }
  1268. // 检查主信息是否已选择
  1269. if(!this.currentRow || !this.currentRow.site){
  1270. this.$message.error('请先选择上方的检验合格单!');
  1271. return false;
  1272. }
  1273. // 获取标签模板列表
  1274. await this.getLabelTemplates();
  1275. // 获取打印机列表
  1276. this.getPrinterList();
  1277. // 打开标签打印对话框
  1278. this.printDialogData = {
  1279. printTimes: 1,
  1280. labelNo: '',
  1281. printerName: ''
  1282. };
  1283. this.printDialogVisible = true;
  1284. },
  1285. // 获取标签模板列表
  1286. async getLabelTemplates(){
  1287. const params = {
  1288. site: this.currentRow.site,
  1289. buNo: this.currentRow.buNo,
  1290. partNo: this.currentRow.partNo
  1291. };
  1292. try {
  1293. const {data} = await getPartLabelTemplateList(params);
  1294. if (data && data.code === 0) {
  1295. this.labelTemplateList = data.list || [];
  1296. if(this.labelTemplateList.length > 0){
  1297. // 默认选中第一个
  1298. this.printDialogData.labelNo = this.labelTemplateList[0].labelNo;
  1299. }
  1300. } else {
  1301. this.$message.error(data.msg || '获取标签模板失败!');
  1302. }
  1303. } catch (error) {
  1304. console.error('获取标签模板失败:', error);
  1305. this.$message.error('获取标签模板失败!');
  1306. }
  1307. },
  1308. // 获取打印机列表
  1309. getPrinterList(){
  1310. try {
  1311. const LODOP = getLodop();
  1312. if (!LODOP) {
  1313. this.$message.error('无法连接到打印控件,请确保已安装并启动 CLodop!');
  1314. return;
  1315. }
  1316. const printerCount = LODOP.GET_PRINTER_COUNT();
  1317. this.printerList = [];
  1318. for (let i = 0; i < printerCount; i++) {
  1319. this.printerList.push(LODOP.GET_PRINTER_NAME(i));
  1320. }
  1321. if(this.printerList.length > 0){
  1322. // 默认选中第一个打印机
  1323. this.printDialogData.printerName = this.printerList[0];
  1324. }
  1325. } catch (error) {
  1326. console.error('获取打印机列表失败:', error);
  1327. this.$message.error('获取打印机列表失败!');
  1328. }
  1329. },
  1330. // 确认打印
  1331. async confirmPrint(){
  1332. // 验证必填项
  1333. if(!this.printDialogData.labelNo){
  1334. this.$message.error('请选择标签模板!');
  1335. return;
  1336. }
  1337. if(!this.printDialogData.printerName){
  1338. this.$message.error('请选择打印机!');
  1339. return;
  1340. }
  1341. this.printLoading = true;
  1342. try {
  1343. // 调用存储过程获取打印参数
  1344. const printDataList = [];
  1345. for(let i = 0; i < this.selectionDataList.length; i++){
  1346. const item = this.selectionDataList[i];
  1347. const params = {
  1348. site: this.currentRow.site,
  1349. buNo: this.currentRow.buNo,
  1350. menuID: this.$route.meta.menuId,
  1351. relatedOrderNo: this.currentRow.poOrderNo,
  1352. relatedOrderLineNo: this.currentRow.poItemNo,
  1353. documentNo: this.currentRow.notifyNo,
  1354. partNo: item.partNo,
  1355. labelNo: this.printDialogData.labelNo,
  1356. rollNo: item.rollNo
  1357. };
  1358. const {data} = await callUspPartLabelTemplate(params);
  1359. if (data && data.code === 0) {
  1360. // 确保 labelNo 字段存在(统一字段名)
  1361. const printData = {
  1362. ...data.row,
  1363. labelNo: data.row.labelNo
  1364. };
  1365. printDataList.push(printData);
  1366. } else {
  1367. this.$message.error(`获取标签 ${item.rollNo} 的打印参数失败:${data.msg}`);
  1368. this.printLoading = false;
  1369. return;
  1370. }
  1371. }
  1372. // 根据 labelNo 调用相应的打印方法
  1373. await this.executePrint(printDataList);
  1374. this.printDialogVisible = false;
  1375. this.$message.success('打印任务已发送!');
  1376. this.getDetailTableList();
  1377. } catch (error) {
  1378. console.error('打印失败:', error);
  1379. this.$message.error('打印失败:' + error.message);
  1380. } finally {
  1381. this.printLoading = false;
  1382. }
  1383. },
  1384. // 执行打印
  1385. async executePrint(printDataList){
  1386. const LODOP = getLodop();
  1387. if (!LODOP) {
  1388. this.$message.error('无法连接到打印控件!');
  1389. return;
  1390. }
  1391. // 初始化打印任务
  1392. LODOP.PRINT_INIT('物料标签打印');
  1393. // 设置打印模式,隐藏水印
  1394. LODOP.SET_PRINT_MODE("PRINT_NOCOLLATE", true);
  1395. // 设置打印机
  1396. LODOP.SET_PRINTER_INDEX(this.printDialogData.printerName);
  1397. for(let times = 0; times < this.printDialogData.printTimes; times++){
  1398. for(let i = 0; i < printDataList.length; i++){
  1399. const printData = printDataList[i];
  1400. // 根据 labelNo 调用不同的打印方法
  1401. if(printData.labelNo === 'A001'){
  1402. await this.printLabelA001(LODOP, printData, i > 0 || times > 0);
  1403. } else if(printData.labelNo === 'A002'){
  1404. await this.printLabelA002(LODOP, printData, i > 0 || times > 0);
  1405. } else if(printData.labelNo === 'A003'){
  1406. await this.printLabelA003(LODOP, printData, i > 0 || times > 0);
  1407. } else {
  1408. this.$message.warning(`未知的标签模板:${printData.labelNo}`);
  1409. }
  1410. }
  1411. }
  1412. // 预览打印(避免水印)
  1413. //LODOP.PREVIEW();
  1414. LODOP.PRINT();
  1415. },
  1416. deleteLabels(){
  1417. if(this.selectionDataList.length===0){
  1418. this.$message.error('未选择标签!');
  1419. return false;
  1420. }
  1421. for (let i = 0; i <this.selectionDataList.length ; i++) {
  1422. if(this.selectionDataList[i].hardtagInFlag!=='未入库'){
  1423. this.$message.error('存在不是未入库状态的标签无法删除!');
  1424. return false;
  1425. }
  1426. }
  1427. deletePoPartLabelData(this.selectionDataList).then(({data}) => {
  1428. if (data && data.code === 0) {
  1429. this.getDetailTableList();
  1430. this.$message.success('删除成功!');
  1431. }else {
  1432. this.$message.error(data.msg);
  1433. }
  1434. })
  1435. },
  1436. openUpload(){
  1437. if(!this.currentRow || !this.currentRow.site){
  1438. this.$message.error('请先选择上方的检验合格单!');
  1439. return false;
  1440. }
  1441. let pageData = {
  1442. flag: 'poPartPrint',
  1443. createBy: this.$store.state.user.name,
  1444. site: this.currentRow.site,
  1445. buNo: this.currentRow.buNo,
  1446. orderNo: this.currentRow.orderNo,
  1447. partNo: this.currentRow.partNo,
  1448. partDesc: this.currentRow.partDesc,
  1449. poOrderNo: this.currentRow.poOrderNo,
  1450. poItemNo: this.currentRow.poItemNo,
  1451. supplierId: this.currentRow.supplierId,
  1452. supplierName: this.currentRow.supplierName,
  1453. orderQty: this.currentRow.orderQty,
  1454. inspectionNo: this.currentRow.orderNo
  1455. }
  1456. this.$refs.qcUpload.init(pageData);
  1457. },
  1458. },
  1459. created() {
  1460. //查询报表的类型
  1461. this.getMainData();
  1462. },
  1463. }
  1464. </script>
  1465. <!--当前页面的标签样式-->
  1466. <style scoped lang="scss">
  1467. /deep/ .customer-tab .el-tabs__content {
  1468. padding: 5px !important;
  1469. }
  1470. /* 搜索卡片样式 */
  1471. .search-card {
  1472. margin-bottom: 16px;
  1473. border-radius: 8px;
  1474. overflow: hidden;
  1475. transition: all 0.3s ease;
  1476. }
  1477. .search-card:hover {
  1478. box-shadow: 0 4px 20px rgba(0, 0, 0, 0.08);
  1479. }
  1480. .search-card /deep/ .el-card__header {
  1481. padding: 5px 20px;
  1482. background: linear-gradient(135deg, #9ac3d0 20%, #b6c7dd 80%);
  1483. border-bottom: none;
  1484. }
  1485. .search-header {
  1486. display: flex;
  1487. justify-content: space-between;
  1488. align-items: center;
  1489. }
  1490. .header-left {
  1491. display: flex;
  1492. align-items: center;
  1493. color: #fff;
  1494. }
  1495. .header-left i {
  1496. font-size: 16px;
  1497. margin-right: 8px;
  1498. }
  1499. .header-title {
  1500. font-size: 14px;
  1501. font-weight: 600;
  1502. letter-spacing: 0.5px;
  1503. }
  1504. .header-right {
  1505. color: #fff;
  1506. }
  1507. .collapse-btn {
  1508. color: #fff;
  1509. font-weight: 500;
  1510. transition: all 0.3s ease;
  1511. }
  1512. .collapse-btn:hover {
  1513. color: #f0f0f0;
  1514. transform: translateY(-1px);
  1515. }
  1516. .collapse-btn i {
  1517. transition: transform 0.3s ease;
  1518. }
  1519. /* 搜索表单样式 */
  1520. .search-form {
  1521. padding: 6px 0;
  1522. min-height: 0;
  1523. }
  1524. /* 卡片主体样式 */
  1525. .search-card /deep/ .el-card__body {
  1526. padding: 10px;
  1527. transition: all 0.3s ease;
  1528. }
  1529. /* 收起时的样式 */
  1530. .search-card.collapsed /deep/ .el-card__body {
  1531. padding: 10px 20px;
  1532. }
  1533. .search-form /deep/ .el-form-item {
  1534. margin-bottom: 12px;
  1535. }
  1536. .search-form /deep/ .el-form-item__label {
  1537. font-weight: 500;
  1538. color: #606266;
  1539. padding-bottom: 4px;
  1540. }
  1541. .search-form /deep/ .el-input__inner,
  1542. .search-form /deep/ .el-textarea__inner {
  1543. border-radius: 6px;
  1544. border: 1px solid #DCDFE6;
  1545. transition: all 0.3s ease;
  1546. }
  1547. .search-form /deep/ .el-input__inner:focus,
  1548. .search-form /deep/ .el-textarea__inner:focus {
  1549. border-color: #9ac3d0;
  1550. box-shadow: 0 0 0 2px rgba(154, 195, 208, 0.1);
  1551. }
  1552. .search-form /deep/ .el-select {
  1553. width: 100%;
  1554. }
  1555. .search-form /deep/ .el-date-editor.el-input {
  1556. width: 100%;
  1557. }
  1558. /* 操作按钮区域 */
  1559. .search-actions {
  1560. display: flex;
  1561. justify-content: space-between;
  1562. align-items: center;
  1563. padding: 8px 0 2px 0;
  1564. }
  1565. /* 展开时显示上边框 */
  1566. .search-card:not(.collapsed) .search-actions {
  1567. border-top: 1px solid #f0f0f0;
  1568. margin-top: 6px;
  1569. }
  1570. /* 收起时不显示上边框和上边距 */
  1571. .search-card.collapsed .search-actions {
  1572. border-top: none;
  1573. margin-top: 0;
  1574. padding-top: 0;
  1575. }
  1576. .action-left,
  1577. .action-right {
  1578. display: flex;
  1579. gap: 8px;
  1580. }
  1581. .search-actions .el-button {
  1582. border-radius: 4px;
  1583. padding: 5px 10px;
  1584. font-size: 12px;
  1585. font-weight: 500;
  1586. transition: all 0.3s ease;
  1587. }
  1588. .search-actions .el-button:hover {
  1589. transform: translateY(-2px);
  1590. box-shadow: 0 4px 12px rgba(0, 0, 0, 0.15);
  1591. }
  1592. .search-actions .el-button--primary {
  1593. background: #60aeff;
  1594. border-color: #60aeff;
  1595. }
  1596. .search-actions .el-button--primary:hover {
  1597. background: #7dbdff;
  1598. border-color: #7dbdff;
  1599. }
  1600. /deep/ .el-form-item__label {
  1601. font-weight: 500;
  1602. }
  1603. /deep/ .el-form-item.is-required .el-form-item__label:before {
  1604. content: '*';
  1605. color: #f56c6c;
  1606. margin-right: 4px;
  1607. }
  1608. /deep/ .dialog-footer {
  1609. padding: 20px 0 0 0;
  1610. text-align: center;
  1611. }
  1612. /deep/ .el-dialog__body {
  1613. padding: 20px;
  1614. }
  1615. /deep/ .el-input.is-disabled .el-input__inner {
  1616. background-color: #f5f7fa;
  1617. border-color: #e4e7ed;
  1618. color: #c0c4cc;
  1619. }
  1620. /* 标签打印对话框样式 */
  1621. .print-dialog {
  1622. /deep/ .el-dialog__header {
  1623. background: linear-gradient(135deg, #9ac3d0 20%, #b6c7dd 80%);
  1624. padding: 20px 20px 20px 20px;
  1625. border-radius: 4px 4px 0 0;
  1626. }
  1627. /deep/ .el-dialog__title {
  1628. color: #ffffff;
  1629. }
  1630. /deep/ .el-dialog__headerbtn .el-dialog__close {
  1631. color: #ffffff;
  1632. font-size: 20px;
  1633. font-weight: bold;
  1634. &:hover {
  1635. color: #f0f0f0;
  1636. }
  1637. }
  1638. /deep/ .el-dialog__body {
  1639. padding: 0;
  1640. }
  1641. .dialog-title-wrapper {
  1642. color: #ffffff;
  1643. display: flex;
  1644. align-items: center;
  1645. }
  1646. .print-dialog-content {
  1647. padding: 25px 30px;
  1648. }
  1649. .print-info-banner {
  1650. background: linear-gradient(135deg, #e8f4f8 0%, #f0f5fb 100%);
  1651. border-left: 4px solid #60aeff;
  1652. padding: 12px 16px;
  1653. border-radius: 4px;
  1654. color: #606266;
  1655. font-size: 14px;
  1656. display: flex;
  1657. align-items: center;
  1658. box-shadow: 0 2px 4px rgba(0,0,0,0.05);
  1659. }
  1660. .form-label {
  1661. font-size: 14px;
  1662. font-weight: 600;
  1663. color: #303133;
  1664. display: flex;
  1665. align-items: center;
  1666. }
  1667. .form-tip {
  1668. font-size: 12px;
  1669. color: #909399;
  1670. margin-top: 5px;
  1671. line-height: 1.5;
  1672. }
  1673. .print-summary {
  1674. background: linear-gradient(135deg, #e1f0f5 0%, #dae8f3 100%);
  1675. border-radius: 8px;
  1676. padding: 16px 20px;
  1677. margin-top: 20px;
  1678. display: flex;
  1679. justify-content: space-around;
  1680. box-shadow: 0 2px 8px rgba(96, 174, 255, 0.15);
  1681. border: 1px solid #c8dff0;
  1682. .summary-item {
  1683. display: flex;
  1684. flex-direction: column;
  1685. align-items: center;
  1686. .summary-label {
  1687. font-size: 12px;
  1688. color: #5a7a8f;
  1689. margin-bottom: 5px;
  1690. font-weight: 500;
  1691. }
  1692. .summary-value {
  1693. font-size: 20px;
  1694. font-weight: bold;
  1695. color: #3a7ba8;
  1696. }
  1697. }
  1698. }
  1699. /deep/ .el-form-item {
  1700. margin-bottom: 18px;
  1701. }
  1702. /deep/ .el-input-number {
  1703. width: 100%;
  1704. .el-input__inner {
  1705. text-align: left;
  1706. }
  1707. }
  1708. /deep/ .el-select {
  1709. .el-input__inner {
  1710. border: 1px solid #DCDFE6;
  1711. transition: all 0.3s;
  1712. &:hover {
  1713. border-color: #409EFF;
  1714. }
  1715. &:focus {
  1716. border-color: #409EFF;
  1717. }
  1718. }
  1719. }
  1720. /deep/ .dialog-footer {
  1721. padding: 15px 30px 25px 30px;
  1722. text-align: center;
  1723. background-color: #fafafa;
  1724. border-top: 1px solid #e8e8e8;
  1725. .el-button {
  1726. min-width: 120px;
  1727. height: 40px;
  1728. font-weight: 500;
  1729. transition: all 0.3s;
  1730. font-size: 15px;
  1731. }
  1732. .el-button--success {
  1733. background: linear-gradient(135deg, #67C23A 0%, #85ce61 100%);
  1734. border: none;
  1735. box-shadow: 0 2px 4px rgba(103, 194, 58, 0.3);
  1736. &:hover {
  1737. transform: translateY(-2px);
  1738. box-shadow: 0 4px 8px rgba(103, 194, 58, 0.4);
  1739. }
  1740. &:active {
  1741. transform: translateY(0);
  1742. }
  1743. }
  1744. }
  1745. }
  1746. /* 选项样式优化 */
  1747. /deep/ .el-select-dropdown__item {
  1748. padding: 10px 20px;
  1749. transition: all 0.2s;
  1750. &:hover {
  1751. background-color: #f5f7fa;
  1752. }
  1753. }
  1754. /* 输入框聚焦效果 */
  1755. /deep/ .el-input__inner:focus,
  1756. /deep/ .el-textarea__inner:focus {
  1757. border-color: #409EFF;
  1758. box-shadow: 0 0 0 2px rgba(64, 158, 255, 0.1);
  1759. }
  1760. </style>