赫艾前端
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.

515 lines
19 KiB

4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
  1. <template>
  2. <div class="mod-config">
  3. <el-form :inline="true" label-position="top" label-width="100px" style="margin-top: -20px;">
  4. <el-form-item :label="'生产订单号'">
  5. <el-input v-model="searchData.orderNo" style="width: 120px"></el-input>
  6. </el-form-item>
  7. <el-form-item >
  8. <span slot="label" style="" @click="getBaseList(24)"><a herf="#">加工中心编码</a></span>
  9. <el-input v-model="searchData.workCenterNo" style="width: 120px"></el-input>
  10. </el-form-item>
  11. <el-form-item >
  12. <span slot="label" style="" @click="getBaseList(5)"><a herf="#">产品编码</a></span>
  13. <el-input v-model="searchData.partNo" style="width: 120px"></el-input>
  14. </el-form-item>
  15. <el-form-item :label="' '">
  16. <el-button @click="search()" style="margin-left: 0px;margin-top:0px" type="primary">查询</el-button>
  17. <download-excel
  18. :fields="exportDataStandard"
  19. :data="tableData"
  20. type="xlsx"
  21. :name="exportName"
  22. :header="exportHeader"
  23. :footer="exportFooter"
  24. :defaultValue="exportDefaultValue"
  25. :fetch="createExportData"
  26. :before-generate="startDownload"
  27. :before-finish="finishDownload"
  28. worksheet="导出信息"
  29. class="el-button el-button--primary el-button--medium">
  30. {{'导出'}}
  31. </download-excel>
  32. </el-form-item>
  33. </el-form>
  34. <el-table
  35. :height="height"
  36. :data="tableData"
  37. border
  38. style="width: 100%">
  39. <el-table-column
  40. prop=""
  41. header-align="center"
  42. align="center"
  43. min-width="50"
  44. label="操作">
  45. <template slot-scope="scope" class="foo_container">
  46. <a type="text" size="small" @click="initReportModal(scope.row)">报告</a>
  47. </template>
  48. </el-table-column>
  49. <el-table-column
  50. prop="orderNo"
  51. header-align="center"
  52. align="left"
  53. min-width="100"
  54. label="生产订单号">
  55. </el-table-column>
  56. <el-table-column
  57. prop="itemNo"
  58. header-align="center"
  59. align="right"
  60. min-width="50"
  61. label="工序号">
  62. </el-table-column>
  63. <el-table-column
  64. prop="operationDesc"
  65. header-align="center"
  66. align="left"
  67. min-width="70"
  68. label="工序名称">
  69. </el-table-column>
  70. <el-table-column
  71. prop="workCenterNo"
  72. header-align="center"
  73. align="left"
  74. min-width="70"
  75. label="加工中心">
  76. </el-table-column>
  77. <el-table-column
  78. prop="workCenterDesc"
  79. header-align="center"
  80. align="left"
  81. min-width="100"
  82. label="加工中心名称">
  83. </el-table-column>
  84. <el-table-column
  85. prop="qtyRequired"
  86. header-align="center"
  87. align="right"
  88. min-width="70"
  89. label="需求数量">
  90. </el-table-column>
  91. <el-table-column
  92. prop="qtyReported"
  93. header-align="center"
  94. align="right"
  95. min-width="70"
  96. label="报告数量">
  97. </el-table-column>
  98. <el-table-column
  99. prop="qtyApprove"
  100. header-align="center"
  101. align="right"
  102. min-width="70"
  103. label="合格数量">
  104. </el-table-column>
  105. <el-table-column
  106. prop="timeRequired"
  107. header-align="center"
  108. align="right"
  109. min-width="70"
  110. label="需求时间">
  111. </el-table-column>
  112. <el-table-column
  113. prop="timeReported"
  114. header-align="center"
  115. align="right"
  116. min-width="70"
  117. label="报告时间">
  118. </el-table-column>
  119. <el-table-column
  120. prop="partNo"
  121. header-align="center"
  122. align="left"
  123. min-width="70"
  124. label="产品编码">
  125. </el-table-column>
  126. <el-table-column
  127. prop="partDescription"
  128. header-align="center"
  129. align="left"
  130. min-width="100"
  131. label="产品名称">
  132. </el-table-column>
  133. <el-table-column
  134. prop="lotSize"
  135. header-align="center"
  136. align="right"
  137. min-width="70"
  138. label="订单数量">
  139. </el-table-column>
  140. <el-table-column
  141. prop="status"
  142. header-align="center"
  143. align="left"
  144. min-width="70"
  145. label="订单状态">
  146. </el-table-column>
  147. </el-table>
  148. <el-dialog @close="closeDialog" :close-on-click-modal="false" :close-on-press-escape="false" v-drag title="报告信息" :visible.sync="setUp.reviewFlag" width="615px">
  149. <el-form :inline="true" label-position="top">
  150. <el-form-item label="生产订单号">
  151. <el-input style="width: 130px;" :disabled="setUp.disabled" onkeyup="this.value = this.value.toUpperCase()" v-model="saveHeaderData.orderNo"></el-input>
  152. </el-form-item>
  153. <el-form-item label="产品编码">
  154. <el-input style="width: 130px;" :disabled="setUp.disabled" v-model="saveHeaderData.partNo"></el-input>
  155. </el-form-item>
  156. <el-form-item label="产品名称/规格型号">
  157. <el-input style="width: 275px;" :disabled="setUp.disabled" v-model="saveHeaderData.partDescription"></el-input>
  158. </el-form-item>
  159. </el-form>
  160. <el-form :inline="true" label-position="top">
  161. <el-form-item label="工序号">
  162. <el-input style="width: 130px;" :disabled="setUp.disabled" v-model="saveHeaderData.itemNo"></el-input>
  163. </el-form-item>
  164. <el-form-item label="工序名称">
  165. <el-input style="width: 130px;" :disabled="setUp.disabled" v-model="saveHeaderData.operationDesc"></el-input>
  166. </el-form-item>
  167. <el-form-item label="加工中心编码">
  168. <el-input style="width: 130px;" :disabled="setUp.disabled" v-model="saveHeaderData.workCenterNo"></el-input>
  169. </el-form-item>
  170. <el-form-item label="加工中心名称">
  171. <el-input style="width: 130px;" :disabled="setUp.disabled" v-model="saveHeaderData.workCenterDesc"></el-input>
  172. </el-form-item>
  173. </el-form>
  174. <el-form :inline="true" label-position="top">
  175. <el-form-item>
  176. <span slot="label" style="" @click="getBaseList(26 ,1)"><a herf="#">操作员</a></span>
  177. <el-input style="width: 130px;" v-model="saveHeaderData.operatorId"></el-input>
  178. </el-form-item>
  179. <el-form-item label="操作员姓名">
  180. <el-input style="width: 130px;" v-model="saveHeaderData.operatorName"></el-input>
  181. </el-form-item>
  182. <el-form-item label="生产日期">
  183. <el-date-picker
  184. style="width: 130px"
  185. v-model="saveHeaderData.planStartTime"
  186. type="date"
  187. value-format="yyyy-MM-dd"
  188. format = "yyyy-MM-dd"
  189. placeholder="选择日期">
  190. </el-date-picker>
  191. </el-form-item>
  192. <el-form-item label="报告日期">
  193. <el-date-picker
  194. style="width: 130px"
  195. v-model="saveHeaderData.planFinishTime"
  196. type="date"
  197. value-format="yyyy-MM-dd"
  198. format = "yyyy-MM-dd"
  199. placeholder="选择日期">
  200. </el-date-picker>
  201. </el-form-item>
  202. </el-form>
  203. <el-form :inline="true" label-position="top">
  204. <el-form-item label="报告数量">
  205. <el-input type="number" oninput="value=value.replace(/[^\d]/g,'')" class="input_left" style="width: 178px;" v-model="saveHeaderData.qtyReported"></el-input>
  206. <!-- <el-input-number style="width: 178px;text-align: right;" v-model="saveHeaderData.qtyRework" size="medium" :min="0" :controls="false"></el-input-number>-->
  207. </el-form-item>
  208. <el-form-item label="合格数量">
  209. <el-input type="number" style="width: 178px;" oninput="value=value.replace(/[^\d]/g,'')" class="input_reight" v-model="saveHeaderData.qtyApprove"></el-input>
  210. <!-- <el-input-number style="width: 178px;text-align: right;" v-model="saveHeaderData.qtyRework" size="medium" :min="0" :controls="false"></el-input-number>-->
  211. </el-form-item>
  212. <el-form-item label="返工数量">
  213. <el-input type="number" style="width: 178px;" oninput="value=value.replace(/[^\d]/g,'')" v-model="saveHeaderData.qtyRework"></el-input>
  214. <!-- <el-input-number style="width: 178px;text-align: right;" v-model="saveHeaderData.qtyRework" size="medium" :min="0" :controls="false"></el-input-number>-->
  215. </el-form-item>
  216. </el-form>
  217. <fieldset class="customer-fieldset" style="width: 597px;margin-left: -10px;">
  218. <legend class="customer-legend">不良品分析</legend>
  219. <el-form :inline="true" label-position="top">
  220. <el-form-item>
  221. <span slot="label" style="" @click="getBaseList(26 ,2)"><a herf="#">操作员</a></span>
  222. <el-input style="width: 178px;" v-model="saveHeaderData.operatorId2"></el-input>
  223. </el-form-item>
  224. <el-form-item label="操作员姓名">
  225. <el-input style="width: 178px;" v-model="saveHeaderData.operatorIdName2"></el-input>
  226. </el-form-item>
  227. <el-form-item label="报废原因">
  228. <el-input style="width: 178px;" v-model="saveHeaderData.scrapReason"></el-input>
  229. </el-form-item>
  230. </el-form>
  231. </fieldset>
  232. <el-form :inline="true" label-position="top">
  233. <el-form-item label="准备时间">
  234. <el-input type="number" style="width: 178px;text-align: right;" v-model="saveHeaderData.preparationTime"></el-input> <!--oninput ="value=value.replace(/[^0-9.]/g,'')"-->
  235. <!-- <el-input-number style="width: 178px;text-align: right;" v-model="saveHeaderData.preparationTime" size="medium" :min="0" :controls="false"></el-input-number>-->
  236. </el-form-item>
  237. <el-form-item label="制造时间">
  238. <el-input type="number" style="width: 178px;" v-model="saveHeaderData.manufacturingTime"></el-input> <!--oninput ="value=value.replace(/[^0-9.]/g,'')"-->
  239. <!-- <el-input-number style="width: 178px;text-align: right;" v-model="saveHeaderData.manufacturingTime" size="medium" :min="0" :controls="false"></el-input-number>-->
  240. </el-form-item>
  241. <el-form-item label="清理时间" label-width="0px">
  242. <el-input type="number" style="width: 178px;" v-model="saveHeaderData.cleaningTime"></el-input> <!--oninput ="value=value.replace(/[^0-9.]/g,'')"-->
  243. <!-- :min="0" 最小值 :controls="false" 隐藏减价按钮 -->
  244. <!-- <el-input-number style="width: 178px;text-align: right;" v-model="saveHeaderData.cleaningTime" size="medium" :min="0" :controls="false"></el-input-number>-->
  245. </el-form-item>
  246. </el-form>
  247. <el-form :inline="true" label-position="top">
  248. <el-form-item label="停机原因">
  249. <el-input style="width: 560px;" v-model="saveHeaderData.shutdownReason"></el-input>
  250. </el-form-item>
  251. </el-form>
  252. <el-form :inline="true" label-position="top">
  253. <el-form-item label="备注">
  254. <el-input style="width: 560px;" v-model="saveHeaderData.remark"></el-input>
  255. </el-form-item>
  256. </el-form>
  257. <span slot="footer" class="dialog-footer">
  258. <el-button @click="setUp.reviewFlag = false">取消</el-button>
  259. <el-button type="primary" :disabled="setUp.saveButton" @click="saveReport()">确定</el-button>
  260. </span>
  261. </el-dialog>
  262. <Chooselist ref="baseList" @getBaseData="getBaseData"></Chooselist>
  263. </div>
  264. </template>
  265. <script>
  266. import {
  267. getGenerateReportList
  268. , saveGenerateReport
  269. } from '@/api/production/generateReport.js'
  270. import Chooselist from '@/views/modules/common/Chooselist'
  271. export default {
  272. name: 'generateReport',
  273. components: {
  274. Chooselist
  275. },
  276. data () {
  277. return {
  278. setUp: {
  279. reviewFlag: false,
  280. saveButton: false,
  281. readonlyFlag: false,
  282. disabled: false
  283. },
  284. saveHeaderData: {
  285. site: '',
  286. orderNo: '',
  287. itemNo: '',
  288. partNo: '',
  289. partDescription: '',
  290. operationDesc: '',
  291. workCenterNo: '',
  292. workCenterDesc: '',
  293. operatorId: '',
  294. operatorName: '',
  295. planStartTime: '',
  296. planFinishTime: '',
  297. qtyReported: 0,
  298. qtyApprove: 0,
  299. qtyRework: 0,
  300. operatorId2: '',
  301. operatorIdName2: '',
  302. scrapReason: '',
  303. preparationTime: 0,
  304. manufacturingTime: 0,
  305. cleaningTime: 0,
  306. shutdownReason: '',
  307. remark: ''
  308. },
  309. site: this.$store.state.user.site,
  310. operatorType: 0,
  311. // 导出 start
  312. exportData: [],
  313. exportDataStandard: {
  314. '日计划单号': 'orderNo',
  315. '计划日期': 'orderDate',
  316. '订单号': 'orderRef1',
  317. '物料编码': 'partNo',
  318. '物料名称': 'partDescription',
  319. '计划数量': 'orderQty',
  320. '已完工数': 'qtyfinished',
  321. '录入人': 'userName',
  322. '录入时间': 'enterDate'
  323. },
  324. exportName: '日计划列表' + this.getStrDate(),
  325. exportHeader: ['日计划列表'],
  326. exportFooter: [],
  327. exportDefaultValue: '这一行这一列没有数据',
  328. // 导出 end
  329. height: 200,
  330. tableData: [],
  331. date1: '',
  332. searchData: {
  333. orderNo: '',
  334. workCenterNo: '',
  335. partNo: '',
  336. site: this.$store.state.user.site
  337. }
  338. }
  339. },
  340. mounted () {
  341. this.$nextTick(() => {
  342. this.height = window.innerHeight - 210
  343. })
  344. },
  345. methods: {
  346. saveReport () {
  347. if (this.saveHeaderData.qtyReported == null || this.saveHeaderData.qtyReported <= 0) {
  348. this.$alert('报告数量错误!', '错误信息', {
  349. confirmButtonText: '确定'
  350. })
  351. return
  352. }
  353. if (this.saveHeaderData.qtyApprove == null || this.saveHeaderData.qtyApprove <= 0) {
  354. this.$alert('合格数量错误!', '错误信息', {
  355. confirmButtonText: '确定'
  356. })
  357. return
  358. }
  359. if (this.saveHeaderData.qtyRework == null || this.saveHeaderData.qtyRework <= 0) {
  360. this.$alert('返工数量错误!', '错误信息', {
  361. confirmButtonText: '确定'
  362. })
  363. return
  364. }
  365. if (this.saveHeaderData.preparationTime == null || this.saveHeaderData.preparationTime <= 0) {
  366. this.$alert('准备时间错误!', '错误信息', {
  367. confirmButtonText: '确定'
  368. })
  369. return
  370. }
  371. if (this.saveHeaderData.manufacturingTime == null || this.saveHeaderData.manufacturingTime <= 0) {
  372. this.$alert('制造时间错误!', '错误信息', {
  373. confirmButtonText: '确定'
  374. })
  375. return
  376. }
  377. if (this.saveHeaderData.cleaningTime == null || this.saveHeaderData.cleaningTime <= 0) {
  378. this.$alert('清理时间错误!', '错误信息', {
  379. confirmButtonText: '确定'
  380. })
  381. return
  382. }
  383. if (parseFloat(this.saveHeaderData.qtyApprove) > parseFloat(this.saveHeaderData.qtyReported)) {
  384. this.$alert('合格数量大于报告数量!', '错误信息', {
  385. confirmButtonText: '确定'
  386. })
  387. return
  388. }
  389. if (this.saveHeaderData.planStartTime == null || this.saveHeaderData.planStartTime === '') {
  390. this.$alert('请选择生产日期!', '错误信息', {
  391. confirmButtonText: '确定'
  392. })
  393. return
  394. }
  395. if (this.saveHeaderData.planFinishTime == null || this.saveHeaderData.planFinishTime === '') {
  396. this.$alert('请选择报告日期!', '错误信息', {
  397. confirmButtonText: '确定'
  398. })
  399. return
  400. }
  401. saveGenerateReport(this.saveHeaderData).then(({data}) => {
  402. if (data.code == 0) {
  403. this.$message.success(data.msg)
  404. this.setUp.reviewFlag = false
  405. this.search()
  406. } else {
  407. this.$alert(data.msg, '错误', {
  408. confirmButtonText: '确定'
  409. })
  410. }
  411. })
  412. },
  413. // 获取基础数据列表S
  414. getBaseList (val, type) {
  415. this.tagNo = val
  416. this.$nextTick(() => {
  417. let strVal = ''
  418. if (val === 24) {
  419. strVal = this.searchData.workCenterNo
  420. } else if (val === 26) {
  421. this.operatorType = type
  422. if (type === 1) {
  423. strVal = this.saveHeaderData.operatorId
  424. } else if (type === 2) {
  425. strVal = this.saveHeaderData.operatorId2
  426. }
  427. }
  428. this.$refs.baseList.init(val, strVal)
  429. })
  430. },
  431. /* 列表方法的回调 */
  432. getBaseData (val) {
  433. console.log(val)
  434. if (this.tagNo === 24) {
  435. this.searchData.workCenterNo = val.WorkCenterNo
  436. } else if (this.tagNo === 26) {
  437. if (this.operatorType === 1) {
  438. this.saveHeaderData.operatorId = val.OperatorID
  439. this.saveHeaderData.operatorName = val.OperatorName
  440. } else if (this.operatorType === 2) {
  441. this.saveHeaderData.operatorId2 = val.OperatorID
  442. this.saveHeaderData.operatorIdName2 = val.OperatorName
  443. }
  444. } else if (this.tagNo === 5) {
  445. this.searchData.partNo = val.PartNo
  446. }
  447. },
  448. initReportModal (row) {
  449. this.setUp.reviewFlag = true
  450. this.setUp.disabled = true
  451. let currentData = JSON.parse(JSON.stringify(row))
  452. this.saveHeaderData.site = currentData.site
  453. this.saveHeaderData.orderNo = currentData.orderNo
  454. this.saveHeaderData.itemNo = currentData.itemNo
  455. this.saveHeaderData.operationDesc = currentData.operationDesc
  456. this.saveHeaderData.partNo = currentData.partNo
  457. this.saveHeaderData.partDescription = currentData.partDescription + '/' + currentData.spec
  458. this.saveHeaderData.workCenterNo = currentData.workCenterNo
  459. this.saveHeaderData.workCenterDesc = currentData.workCenterDesc
  460. this.saveHeaderData.planFinishTime = this.dayjs(new Date()).format('YYYY-MM-DD 00:00:00')
  461. this.saveHeaderData.planStartTime = this.dayjs(new Date()).format('YYYY-MM-DD 00:00:00')
  462. },
  463. closeDialog () {
  464. Object.assign(this.$data.saveHeaderData, this.$options.data.call(this).saveHeaderData)
  465. },
  466. search () {
  467. getGenerateReportList(this.searchData).then(({data}) => {
  468. this.tableData = data.rows
  469. })
  470. },
  471. createExportData () {
  472. return this.tableData
  473. },
  474. startDownload () {
  475. // this.exportData = this.dataList
  476. },
  477. finishDownload () {
  478. },
  479. getStrDate () {
  480. let dd = new Date()
  481. let Y = dd.getFullYear()
  482. let M = (dd.getMonth() + 1) < 10 ? '0' + (dd.getMonth() + 1) : (dd.getMonth() + 1)// 获取当前月份的日期,不足10补0
  483. let D = dd.getDate() < 10 ? '0' + dd.getDate() : dd.getDate()// 获取当前几号,不足10补0
  484. let H = dd.getHours() < 10 ? '0' + dd.getHours() : dd.getHours()
  485. let MM = dd.getMinutes() < 10 ? '0' + dd.getMinutes() : dd.getMinutes()
  486. let S = dd.getSeconds() < 10 ? '0' + dd.getSeconds() : dd.getSeconds()
  487. return Y + M + D + H + MM + S
  488. }
  489. },
  490. created () {
  491. }
  492. }
  493. </script>
  494. <style scoped>
  495. .input_left{
  496. text-align: left;
  497. }
  498. .input_reight{
  499. text-align: right;
  500. }
  501. /deep/ input::-webkit-inner-spin-button {
  502. -webkit-appearance: none !important;
  503. }
  504. input[type='number'] {
  505. -moz-appearance: textfield !important;
  506. }
  507. </style>