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.

447 lines
13 KiB

4 months ago
4 months ago
4 months ago
4 months ago
4 months ago
4 months ago
4 months ago
  1. <template>
  2. <div class="mod-config">
  3. <el-form :inline="true" :model="dataForm" @keyup.enter.native="getDataList()">
  4. <el-form-item>
  5. <el-input v-model="dataForm.partNo" placeholder="物料编码" clearable></el-input>
  6. </el-form-item>
  7. <el-form-item>
  8. <el-input v-model="dataForm.batchNo" placeholder="批次号" clearable></el-input>
  9. </el-form-item>
  10. <el-form-item>
  11. <el-input v-model="dataForm.locationId" placeholder="库位" clearable></el-input>
  12. </el-form-item>
  13. <el-form-item>
  14. <el-input v-model="dataForm.descriptionLike" placeholder="物料描述" clearable></el-input>
  15. </el-form-item>
  16. <el-form-item>
  17. <el-input v-model="dataForm.minUnPrintQty" placeholder="最小未打印数量" type="number" clearable></el-input>
  18. </el-form-item>
  19. <el-form-item>
  20. <el-button @click="getDataList()">查询</el-button>
  21. <el-button @click="resetForm()">重置</el-button>
  22. </el-form-item>
  23. </el-form>
  24. <el-table
  25. :data="dataList"
  26. border
  27. :height="height"
  28. v-loading="dataListLoading"
  29. @selection-change="selectionChangeHandle"
  30. style="width: 100%;">
  31. <el-table-column
  32. type="selection"
  33. header-align="center"
  34. align="center"
  35. width="50">
  36. </el-table-column>
  37. <el-table-column
  38. prop="site"
  39. header-align="center"
  40. align="center"
  41. label="站点">
  42. </el-table-column>
  43. <el-table-column
  44. prop="warehouseId"
  45. header-align="center"
  46. align="center"
  47. label="仓库">
  48. </el-table-column>
  49. <el-table-column
  50. prop="partNo"
  51. header-align="center"
  52. align="center"
  53. label="物料编码">
  54. </el-table-column>
  55. <el-table-column
  56. prop="description"
  57. header-align="center"
  58. align="center"
  59. label="物料描述">
  60. </el-table-column>
  61. <el-table-column
  62. prop="umid"
  63. header-align="center"
  64. align="center"
  65. label="单位">
  66. </el-table-column>
  67. <el-table-column
  68. prop="batchNo"
  69. header-align="center"
  70. align="center"
  71. label="批次号">
  72. </el-table-column>
  73. <el-table-column
  74. prop="wdr"
  75. header-align="center"
  76. align="center"
  77. label="WDR">
  78. </el-table-column>
  79. <el-table-column
  80. prop="locationId"
  81. header-align="center"
  82. align="center"
  83. label="库位">
  84. </el-table-column>
  85. <el-table-column
  86. prop="qtyOnHand"
  87. header-align="center"
  88. align="center"
  89. label="现有库存">
  90. </el-table-column>
  91. <el-table-column
  92. prop="printQty"
  93. header-align="center"
  94. align="center"
  95. label="已打印数量">
  96. </el-table-column>
  97. <el-table-column
  98. prop="unPrintQty"
  99. header-align="center"
  100. align="center"
  101. label="未打印数量">
  102. </el-table-column>
  103. <el-table-column
  104. fixed="right"
  105. header-align="center"
  106. align="center"
  107. width="150"
  108. label="操作">
  109. <template slot-scope="scope">
  110. <a type="text" @click="createHuHandle(scope.row)">创建HU</a>
  111. </template>
  112. </el-table-column>
  113. </el-table>
  114. <el-pagination
  115. @size-change="sizeChangeHandle"
  116. @current-change="currentChangeHandle"
  117. :current-page="pageIndex"
  118. :page-sizes="[ 20, 50, 100]"
  119. :page-size="pageSize"
  120. :total="totalPage"
  121. layout="total, sizes, prev, pager, next, jumper">
  122. </el-pagination>
  123. <!-- 创建HU弹窗 -->
  124. <el-dialog
  125. title="创建HandlingUnit"
  126. :visible.sync="createHuVisible"
  127. width="400px"
  128. :close-on-click-modal="false">
  129. <el-form :model="createHuForm" ref="createHuForm" class="create-hu-form">
  130. <el-row :gutter="20">
  131. <el-col :span="12">
  132. <el-form-item label="物料编码" prop="partNo" class="form-item-vertical">
  133. <el-input v-model="createHuForm.partNo" readonly></el-input>
  134. </el-form-item>
  135. </el-col>
  136. <el-col :span="12">
  137. <el-form-item label="批次号" prop="batchNo" class="form-item-vertical">
  138. <el-input v-model="createHuForm.batchNo" readonly></el-input>
  139. </el-form-item>
  140. </el-col>
  141. </el-row>
  142. <el-row :gutter="20">
  143. <el-col :span="12">
  144. <el-form-item label="WDR" prop="wdr" class="form-item-vertical">
  145. <el-input v-model="createHuForm.wdr" readonly></el-input>
  146. </el-form-item>
  147. </el-col>
  148. <el-col :span="12">
  149. <el-form-item label="库位" prop="locationId" class="form-item-vertical">
  150. <el-input v-model="createHuForm.locationId" readonly></el-input>
  151. </el-form-item>
  152. </el-col>
  153. </el-row>
  154. <el-row :gutter="20">
  155. <el-col :span="8">
  156. <el-form-item label="库存数量" prop="qtyOnHand" class="form-item-vertical">
  157. <el-input v-model="createHuForm.qtyOnHand" readonly></el-input>
  158. </el-form-item>
  159. </el-col>
  160. <el-col :span="8">
  161. <el-form-item label="未打印数量" prop="unPrintQty" class="form-item-vertical">
  162. <el-input v-model="createHuForm.unPrintQty" readonly></el-input>
  163. </el-form-item>
  164. </el-col>
  165. <el-col :span="8">
  166. <el-form-item label="单位" prop="umid" class="form-item-vertical">
  167. <el-input v-model="createHuForm.umid" readonly></el-input>
  168. </el-form-item>
  169. </el-col>
  170. </el-row>
  171. <el-row :gutter="20">
  172. <el-col :span="24">
  173. <el-form-item label="物料描述" prop="partDesc" class="form-item-vertical">
  174. <el-input v-model="createHuForm.partDesc" readonly></el-input>
  175. </el-form-item>
  176. </el-col>
  177. </el-row>
  178. <el-row :gutter="20">
  179. <el-col :span="12">
  180. <el-form-item label="包装数" prop="packageCount" class="form-item-vertical">
  181. <el-input
  182. v-model="createHuForm.packageCount"
  183. :min="1"
  184. placeholder="请输入包装数">
  185. </el-input>
  186. </el-form-item>
  187. </el-col>
  188. <el-col :span="12">
  189. <el-form-item label="单包装数量" prop="perPackageQty" class="form-item-vertical">
  190. <el-input
  191. v-model="createHuForm.perPackageQty"
  192. :min="0.01"
  193. :precision="2"
  194. placeholder="请输入单包装数量">
  195. </el-input>
  196. </el-form-item>
  197. </el-col>
  198. </el-row>
  199. </el-form>
  200. <div slot="footer" class="dialog-footer">
  201. <el-button @click="createHuVisible = false">取消</el-button>
  202. <el-button type="primary" @click="createHuSubmit()" :loading="createHuLoading">创建并打印</el-button>
  203. </div>
  204. </el-dialog>
  205. </div>
  206. </template>
  207. <script>
  208. import { getInventoryStockList, createHandlingUnits, printLabel } from '@/api/warehouse/ifsInventoryInit'
  209. export default {
  210. data () {
  211. return {
  212. dataForm: {
  213. partNo: '',
  214. batchNo: '',
  215. locationId: '',
  216. descriptionLike: '',
  217. minUnPrintQty: 0
  218. },
  219. dataList: [],
  220. pageIndex: 1,
  221. pageSize: 50,
  222. totalPage: 0,
  223. height: 500,
  224. dataListLoading: false,
  225. dataListSelections: [],
  226. createHuVisible: false,
  227. createHuLoading: false,
  228. createHuForm: {
  229. site: '',
  230. warehouseId: '',
  231. partNo: '',
  232. partDesc: '',
  233. batchNo: '',
  234. wdr: '',
  235. locationId: '',
  236. umid: '',
  237. perPackageQty: 1,
  238. packageCount: 1
  239. },
  240. createHuRules: {
  241. perPackageQty: [
  242. { required: true, message: '单包装数量不能为空', trigger: 'blur' },
  243. { type: 'number', min: 0.01, message: '单包装数量必须大于0', trigger: 'blur' }
  244. ],
  245. packageCount: [
  246. { required: true, message: '包装数不能为空', trigger: 'blur' },
  247. { type: 'number', min: 1, message: '包装数必须大于等于1', trigger: 'blur' }
  248. ]
  249. },
  250. // 打印相关配置
  251. reportId: 'HU_LABEL',
  252. zplCode: '',
  253. paperSize: 'A4',
  254. orientation: 'Portrait',
  255. dpi: 300
  256. }
  257. },
  258. activated () {
  259. this.getDataList()
  260. },
  261. methods: {
  262. // 获取数据列表
  263. getDataList () {
  264. this.dataListLoading = true
  265. const params = {
  266. page: this.pageIndex,
  267. size: this.pageSize,
  268. site: localStorage.getItem('site'),
  269. ...this.dataForm
  270. }
  271. getInventoryStockList(params).then(({ data }) => {
  272. if (data && data.code === 0) {
  273. this.dataList = data.page.list
  274. this.totalPage = data.page.totalCount
  275. } else {
  276. this.dataList = []
  277. this.totalPage = 0
  278. }
  279. this.dataListLoading = false
  280. }).catch(() => {
  281. this.dataListLoading = false
  282. })
  283. },
  284. // 每页数
  285. sizeChangeHandle (val) {
  286. this.pageSize = val
  287. this.pageIndex = 1
  288. this.getDataList()
  289. },
  290. // 当前页
  291. currentChangeHandle (val) {
  292. this.pageIndex = val
  293. this.getDataList()
  294. },
  295. // 多选
  296. selectionChangeHandle (val) {
  297. this.dataListSelections = val
  298. },
  299. // 创建HU
  300. createHuHandle (row) {
  301. this.createHuVisible = true
  302. this.createHuForm = {
  303. site: row.site,
  304. warehouseId: row.warehouseId,
  305. partNo: row.partNo,
  306. partDesc: row.description || '',
  307. batchNo: row.batchNo,
  308. wdr: row.wdr,
  309. locationId: row.locationId,
  310. qtyOnHand: row.qtyOnHand,
  311. unPrintQty: row.unPrintQty,
  312. umid: row.umid,
  313. perPackageQty: '',
  314. packageCount: 1
  315. }
  316. this.$nextTick(() => {
  317. this.$refs['createHuForm'].clearValidate()
  318. })
  319. },
  320. // 提交创建HU
  321. createHuSubmit () {
  322. this.$refs['createHuForm'].validate((valid) => {
  323. if (valid) {
  324. this.createHuLoading = true
  325. createHandlingUnits(this.createHuForm).then(({ data }) => {
  326. if (data && data.code === 0) {
  327. this.$message({
  328. message: '创建HandlingUnit成功',
  329. type: 'success',
  330. duration: 1500
  331. })
  332. let printLabelType;
  333. if (this.createHuForm.partNo && this.createHuForm.partNo.startsWith("80")) {
  334. printLabelType = '库存成品标签';
  335. } else {
  336. printLabelType = 'BIL标签';
  337. }
  338. // 创建成功后进行打印
  339. this.printHandlingUnits(data.unitIds,printLabelType)
  340. this.createHuVisible = false
  341. this.getDataList()
  342. } else {
  343. this.$message.error(data.msg || '创建HandlingUnit失败')
  344. }
  345. this.createHuLoading = false
  346. }).catch(() => {
  347. this.createHuLoading = false
  348. })
  349. }
  350. })
  351. },
  352. // 打印HandlingUnit标签
  353. async printHandlingUnits (unitIds,printLabelType) {
  354. if (!unitIds || unitIds.length === 0) {
  355. return
  356. }
  357. try {
  358. // 逐个打印每个HandlingUnit
  359. for (const unitId of unitIds) {
  360. await this.printViaServer(unitId,printLabelType)
  361. }
  362. this.$message({
  363. message: `成功打印 ${unitIds.length} 个HandlingUnit标签`,
  364. type: 'success',
  365. duration: 2000
  366. })
  367. } catch (error) {
  368. this.$message.error('打印失败: ' + error.message)
  369. }
  370. },
  371. // 通过服务器打印
  372. async printViaServer(unitId,printLabelType) {
  373. try {
  374. const printRequest = {
  375. reportId: this.reportId,
  376. zplCode: this.zplCode,
  377. paperSize: this.paperSize,
  378. orientation: this.orientation,
  379. dpi: this.dpi,
  380. userId: localStorage.getItem('userName'),
  381. username: localStorage.getItem('userName'),
  382. site: localStorage.getItem('site'),
  383. unitId: unitId,
  384. labelType: printLabelType
  385. }
  386. const { data } = await printLabel(printRequest)
  387. if (data.code === 200) {
  388. return Promise.resolve();
  389. } else {
  390. return Promise.reject(new Error(data.msg || '打印失败'));
  391. }
  392. } catch (error) {
  393. return Promise.reject(error);
  394. }
  395. },
  396. // 重置表单
  397. resetForm() {
  398. this.dataForm = {
  399. partNo: '',
  400. batchNo: '',
  401. locationId: '',
  402. descriptionLike: '',
  403. minUnPrintQty: 0
  404. }
  405. this.pageIndex = 1
  406. this.getDataList()
  407. }
  408. }
  409. }
  410. </script>
  411. <style scoped>
  412. .mod-config .el-form-item {
  413. margin-bottom: 15px;
  414. }
  415. /* 创建HU表单样式 */
  416. .create-hu-form .form-item-vertical {
  417. margin-bottom: 20px;
  418. }
  419. .create-hu-form .form-item-vertical .el-form-item__label {
  420. display: block;
  421. text-align: left;
  422. padding: 0 0 8px 0;
  423. line-height: 1.5;
  424. font-weight: 500;
  425. }
  426. .create-hu-form .form-item-vertical .el-form-item__content {
  427. margin-left: 0 !important;
  428. }
  429. .create-hu-form .el-row {
  430. margin-bottom: 0;
  431. }
  432. </style>