PrintingPlateRequisition.vue 27 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893
  1. <template>
  2. <div>
  3. <layout>
  4. <layout-header>
  5. <div class="">
  6. <!-- 按钮部分-->
  7. <el-form ref="elSearchFormRef" class="demo-form-inline" :rules="searchRule" >
  8. <el-form-item>
  9. <el-input v-model="searchInfo" placeholder="搜索物料名称" clearable style="width: 200px;margin: 5px"></el-input>
  10. <el-button type="primary" class="bt" icon="search" @click="on_search">查询</el-button>
  11. <el-button type="primary" class="bt" icon="edit" :disabled="!yblyselectedvalue" @click="onout">领出</el-button>
  12. <el-button type="primary" class="bt" icon="document" :disabled="!yblyselectedvalue" @click="onwithdraw">收回</el-button>
  13. <!-- <el-button type="primary" class="bt" icon="delete" :disabled="!selectedIds" @click="on_delete">删除</el-button> -->
  14. <el-button type="primary" icon="edit" class="bt"@click=" () => { dialogGxclhc = true;}">工序产量核查</el-button>
  15. <el-button type="primary" class="bt" icon="download" @click="ToExcel" >导出到Excel</el-button>
  16. </el-form-item>
  17. </el-form>
  18. </div>
  19. </layout-header>
  20. <layout>
  21. <!-- 左侧树侧形结构-->
  22. <layout-sider :resize-directions="['right']" :width="190" style="margin-right: 10px;">
  23. <div class="JKWTree-tree" style="height: 200px">
  24. <h3>工单印版领用</h3>
  25. <el-tree :data="treeData" :props="defaultProps" @node-click="handleNodeClick" @node-expand="handleNodeExpand">
  26. </el-tree>
  27. </div>
  28. </layout-sider>
  29. <!-- 右侧区域 -->
  30. <layout-content >
  31. <el-main>
  32. <div class="gva-table-box">
  33. <!-- 表格数据 -->
  34. <el-table ref="multipleTable" style="width: 100%;height: 33vh" tooltip-effect="dark"
  35. :row-style="{ height: '25px' }" :header-cell-style="{ padding: '0px' }"
  36. :cell-style="{ padding: '0px' }" :header-row-style="{ height: '20px' }"
  37. :data="wltableData" border row-key="ID"
  38. size="small" v-if="!showKH"
  39. :cell-class-name="gxbgCellClass" id="wltable"
  40. highlight-current-row="true" @row-dblclick="updateCompanyFunc"
  41. :row-class-name="rowClassStyle" @selection-change="yblySelectionChange"
  42. @row-click="tableRowClick" :show-overflow-tooltip="true"
  43. >
  44. >
  45. <el-table-column fixed type="selection" width="30" />
  46. <el-table-column sortable align="center" label="存货编码" prop="存货编码" width="120" />
  47. <el-table-column sortable align="center" label="物料名称" prop="物料名称" width="120" />
  48. <el-table-column align="center" label="印版名称" prop="印版名称" width="200" />
  49. <el-table-column align="center" label="供方批号" prop="供方批号" width="200" />
  50. <el-table-column align="center" label="制造日期" prop="制造日期" width="110" />
  51. <el-table-column align="center" label="当前领用工单" prop="工单编号" width="130" />
  52. <el-table-column align="center" label="原始印数" prop="原始印数" width="110" />
  53. <el-table-column align="center" label="累计印数" prop="累计印数" width="110" />
  54. <el-table-column align="center" label="考核印数" prop="考核印数" width="110" />
  55. <el-table-column align="center" label="报废日期" prop="报废日期" width="200" />
  56. <el-table-column align="center" label="创建用户" prop="创建用户" width="110" />
  57. <el-table-column align="center" label="创建时间" prop="创建时间" width="110" />
  58. <el-table-column align="center" label="修改时间" prop="修改时间" width="110" />
  59. </el-table>
  60. <!-- 分页 -->
  61. <div class="gva-pagination">
  62. <el-pagination
  63. @size-change="handleSizeChange"
  64. @current-change="handleCurrentChange"
  65. :current-page="page"
  66. :page-size="pageSize"
  67. layout="total, sizes, prev, pager, next, jumper"
  68. :total="total">
  69. </el-pagination>
  70. </div>
  71. </div>
  72. <div class="gva-table-box">
  73. <!-- 表格数据 -->
  74. <el-table ref="multipleTable" style="width: 100%;height: 38vh" tooltip-effect="dark"
  75. :row-style="{ height: '25px' }" :header-cell-style="{ padding: '0px' }"
  76. :cell-style="{ padding: '0px' }" :header-row-style="{ height: '20px' }"
  77. :data="wlmxtableData" border row-key="ID"
  78. size="small" v-if="!showKH"
  79. :cell-class-name="gxbgCellClass"
  80. highlight-current-row="true" @row-dblclick="updateCompanyFunc2"
  81. @row-click="gdtableRowClick" :show-overflow-tooltip="true"
  82. @selection-change="wlmxSelectionChange">
  83. <el-table-column type="selection" width="30" />
  84. <el-table-column sortable align="center" label="领用机台" prop="领用机台" width="120" />
  85. <el-table-column sortable align="center" label="领用日期" prop="领用日期" width="180" />
  86. <el-table-column sortable align="center" label="退还日期" prop="退还日期" width="180" />
  87. <el-table-column sortable align="center" label="印数" prop="印数" width="100" />
  88. <el-table-column sortable align="center" label="工单编号" prop="工单编号" width="100" />
  89. <el-table-column sortable align="center" label="成品代号" prop="成品代号" width="100" />
  90. <el-table-column sortable align="center" label="成品名称" prop="成品名称" width="220" />
  91. </el-table>
  92. </div>
  93. <el-dialog
  94. v-model="dialogPlateVisible"
  95. :before-close="dhlcloseDialog"
  96. :title="'印版工单发放'"
  97. destroy-on-close
  98. :width="'40%'"
  99. :style="{ minWidth: '700px' }"
  100. >
  101. <el-form :model="Plate" label-width="120px">
  102. <el-row :gutter="20">
  103. <el-col :span="12">
  104. <el-form-item label="工单编号">
  105. <el-input
  106. v-model="Plate.工单编号"
  107. id="工单编号"
  108. @keyup.enter="handleKeyDown"
  109. placeholder="请输入工单编号"
  110. />
  111. </el-form-item>
  112. </el-col>
  113. <el-col :span="12">
  114. <el-form-item label="印件号">
  115. <el-input v-model="Plate.印件号" readonly />
  116. </el-form-item>
  117. </el-col>
  118. </el-row>
  119. <el-row :gutter="20">
  120. <el-col :span="18">
  121. <el-form-item label="产品名称">
  122. <el-input v-model="Plate.产品名称" readonly />
  123. </el-form-item>
  124. </el-col>
  125. </el-row>
  126. <el-row :gutter="20">
  127. <el-col style="margin-left:120px" :span="20">
  128. <el-radio-group v-model="Plate.车间" >
  129. <el-radio label="胶印车间" border >胶印车间</el-radio>
  130. <el-radio label="凹丝印车间" border >凹丝印车间</el-radio>
  131. <el-radio label="印后车间" border >印后车间</el-radio>
  132. <!-- <el-radio label="其他" border >其他</el-radio> -->
  133. </el-radio-group>
  134. </el-col>
  135. </el-row>
  136. <el-row :gutter="20">
  137. <el-col :span="10">
  138. <el-form-item style="margin-top:20px" label="机台备注">
  139. <el-input
  140. v-model="Plate.机台备注"
  141. id="机台备注"
  142. @keyup.enter="openMachineSelectDialog"
  143. placeholder="请输入机台备注"
  144. readonly
  145. />
  146. </el-form-item>
  147. </el-col>
  148. </el-row>
  149. </el-form>
  150. <template #footer>
  151. <div class="dialog-footer" style="width: 100%;">
  152. <el-button @click="dhlcloseDialog" style="width: 100px; height: 40px;">关 闭</el-button>
  153. <el-button type="primary" @click="dhlenterDialog" style="width: 100px; height: 40px;">确 定</el-button>
  154. </div>
  155. </template>
  156. </el-dialog>
  157. <!-- 退回弹窗 -->
  158. <el-dialog
  159. v-model="dialogwithdrawVisible"
  160. title="印版印数"
  161. :width="'20%'"
  162. :style="{ minWidth: '200px' }"
  163. >
  164. <el-form-item label="印数">
  165. <el-input v-model="Plate.印数" type="number" placeholder="请输入印数" />
  166. </el-form-item>
  167. <template #footer>
  168. <div class="dialog-footer" style="width: 100%;">
  169. <el-button @click="rawcloseDialog" style="width: 100px; height: 40px;">关 闭</el-button>
  170. <el-button type="primary" @click="rawenterDialog" style="width: 100px; height: 40px;">确 定</el-button>
  171. </div>
  172. </template>
  173. </el-dialog>
  174. <!-- 工单选择弹窗 -->
  175. <el-dialog
  176. v-model="orderSelectDialogVisible"
  177. title="请选择工单"
  178. width="60%"
  179. @keyup.enter="confirmOrderSelection"
  180. >
  181. <el-table
  182. ref="orderTableRef"
  183. :data="orderList"
  184. highlight-current-row
  185. @current-change="handleOrderSelect"
  186. @row-dblclick="confirmOrderSelection"
  187. @keyup.enter.native="confirmOrderSelection"
  188. >
  189. <el-table-column prop="yj_Yjno" label="印件号" />
  190. <el-table-column prop="Gd_cpmc" label="产品名称" />
  191. </el-table>
  192. </el-dialog>
  193. <!-- 机台选择弹窗 -->
  194. <el-dialog
  195. v-model="machineSelectDialogVisible"
  196. title="请选择机台"
  197. width="40%"
  198. @keyup.enter="confirmMachineSelection"
  199. >
  200. <el-table
  201. ref="machineTableRef"
  202. :data="machineList"
  203. highlight-current-row
  204. @current-change="handleMachineSelect"
  205. @row-dblclick="confirmMachineSelection"
  206. @keyup.enter.native="confirmMachineSelection"
  207. >
  208. <el-table-column prop="value" label="机台编号" />
  209. </el-table>
  210. </el-dialog>
  211. <!-- 工序产量核查 -->
  212. <Gxclhc v-if="dialogGxclhc" v-model="dialogGxclhc"
  213. :gdbh="gdbh" :jjcp_yjno = "jjcp_yjno"
  214. />
  215. </el-main>
  216. </layout-content>
  217. </layout>
  218. </layout>
  219. </div>
  220. </template>
  221. <script setup>
  222. // 全量引入格式化工具 请按需保留
  223. import { Layout, LayoutSider, LayoutContent } from '@arco-design/web-vue';
  224. import {ref, reactive,nextTick} from 'vue'
  225. import * as XLSX from 'xlsx'
  226. import FileSaver from 'file-saver'
  227. import dayjs, { Dayjs } from 'dayjs';
  228. import { exportExcelFile } from '@/utils/excel'
  229. import { useUserStore } from '@/pinia/modules/user'
  230. import {autocompleteEmits, ElMessage,ElMessageBox} from "element-plus";
  231. import {getOrderInfo,} from '@/api/mes_api_gty/workOrderVerification'
  232. import Gxclhc from '@/view/performance/12-orderAccounting/componets/gxclhc.vue'
  233. import {getPPTab,getPPList,getMachine,getPPgdReceive,getPPCode,getPPReceive,getPPDelete} from "@/api/mes/job.js"
  234. import {PrintDetailEdit,} from '@/api/jixiaoguanli/baogong'
  235. import {gdzl_MachineList} from "@/api/yunyin/yunying";
  236. import { placeholderSign } from 'element-plus/es/components/table-v2/src/private';
  237. const userStore = useUserStore()
  238. const sys_id='['+userStore.userInfo.userName+'/'+userStore.userInfo.nickName+']'
  239. defineOptions({name: 'Company'})
  240. // 分页
  241. const page = ref(1)
  242. const total = ref(0)
  243. const pageSize = ref(20)
  244. const handleCurrentChange = (val) => {
  245. page.value = val;
  246. _WorkList_page();
  247. };
  248. // 修改页面容量 点击多少条/页
  249. const handleSizeChange = (val) => {
  250. // page.value = 10;
  251. pageSize.value = val;
  252. _WorkList_page();
  253. };
  254. const _WorkList_page = async () =>{
  255. console.log(searchInfo.value)
  256. if (searchInfo.value === ''){
  257. // showKH.value = node.code === '客户产品印版库'?true:false;
  258. const res = await getPPList({code:nodecode.value,page:page.value,limit:pageSize.value,key:'1'})
  259. total.value = res.data.total
  260. wltableData.value = res.data.data
  261. }else{
  262. // showKH.value = node.code === '客户产品印版库'?true:false;
  263. const res = await getPPList({code:'',search:searchInfo.value,page:page.value,limit:pageSize.value,key:'1'})
  264. total.value = res.data.total
  265. wltableData.value = res.data.data
  266. }
  267. }
  268. // =========== 获取左侧树侧形结构 ===========
  269. const treeData = ref([])
  270. const getTreeData = async () => {
  271. try {
  272. const res = await getPPTab()
  273. if (res.code === 0) {
  274. treeData.value = transformData(res.data)
  275. }
  276. } catch (error) {
  277. console.error('请求出错:', error)
  278. }
  279. }
  280. // 转换数据格式为el-tree需要的结构
  281. const transformData = (data) => {
  282. return Object.entries(data).map(([key, value]) => {
  283. const children = Object.entries(value).map(([subKey, subValue]) => {
  284. return {
  285. label: subKey,
  286. children: Object.entries(subValue).map(([typeKey, typeValue]) => {
  287. return {
  288. label: typeKey,
  289. children: typeValue.map(item => ({
  290. label: item,
  291. code: key
  292. }))
  293. }
  294. })
  295. }
  296. })
  297. return {
  298. label: key,
  299. children
  300. }
  301. })
  302. }
  303. getTreeData()
  304. const showKH = ref(false)
  305. const dialogGxclhc = ref(false)
  306. const wltableData = ref([])
  307. const nodecode = ref('')
  308. const handleNodeClick = async (node) => {
  309. console.log(node)
  310. if(!node.children){
  311. nodecode.value = node.label.split(' ')[0]
  312. showKH.value = node.code === '客户产品印版库'?true:false;
  313. const res = await getPPList({code:node.label.split(' ')[0],page:page.value,limit:pageSize.value,key:'1'})
  314. if (res.code === 0){
  315. total.value = res.data.total
  316. wltableData.value = res.data.data
  317. }else{
  318. total.value = 0
  319. wltableData.value = []
  320. wlmxtableData.value = []
  321. }
  322. }
  323. }
  324. const searchInfo = ref('')
  325. const on_search = async () => {
  326. if (searchInfo.value != ''){
  327. const res = await getPPList({code:'',search:searchInfo.value,page:page.value,limit:pageSize.value,key:'1'})
  328. if (res.code === 0) {
  329. total.value = res.data.total
  330. wltableData.value = res.data.data
  331. }else{
  332. ElMessage.error('未搜索到数据')
  333. }
  334. }
  335. }
  336. const wlmxtableData = ref([])
  337. const clickedRow = ref(null)
  338. const tableRowClick = async (row) => {
  339. try {
  340. console.log(row)
  341. clickedRow.value = row;
  342. console.log(clickedRow.value)
  343. // const res = await getPPReceive({ code: row.存货编码,batch:row.供方批号})
  344. // if (res.code === 0) {
  345. // wlmxtableData.value = res.data
  346. // }else{
  347. // wlmxtableData.value = []
  348. // }
  349. } catch (error) {
  350. }
  351. }
  352. //刷新表格数据
  353. const data_refresh = async () =>{
  354. try {
  355. console.log(clickedRow.value)
  356. const res1 = await getPPList({code:nodecode.value,page:page.value,limit:pageSize.value,key:'1'})
  357. if (res1.code === 0){
  358. total.value = res1.data.total
  359. wltableData.value = res1.data.data
  360. }else{
  361. total.value = 0
  362. wltableData.value = []
  363. wlmxtableData.value = []
  364. }
  365. // const res = await getPPReceive({ code: clickedRow.value.存货编码,batch:clickedRow.value.供方批号})
  366. // if (res.code === 0) {
  367. // wlmxtableData.value = res.data
  368. // }else{
  369. // wlmxtableData.value = []
  370. // }
  371. } catch (error) {
  372. ElMessage.error('获取数据失败')
  373. }
  374. }
  375. //新增
  376. // 定义名称到车间的映射
  377. const nameToWorkshop = {
  378. '易鹏': '印后车间',
  379. '华余峰': '胶印车间',
  380. '柴春才': '凹丝印车间'
  381. }
  382. const Plate = reactive({
  383. 车间: nameToWorkshop[userStore.userInfo.nickName] || ''
  384. })
  385. // 弹窗控制
  386. const dialogPlateVisible = ref(false)
  387. const dialogwithdrawVisible = ref(false)
  388. const orderSelectDialogVisible = ref(false)
  389. const machineSelectDialogVisible = ref(false)
  390. // 表格引用
  391. const orderTableRef = ref(null)
  392. const machineTableRef = ref(null)
  393. // 工单和机台数据
  394. const orderList = ref([])
  395. const machineList = ref([])
  396. // 当前选中项
  397. const selectedOrder = ref(null)
  398. const selectedMachine = ref(null)
  399. const yblyselectedvalue = ref(null) // 初始值设为 null
  400. const yblySelectionChange = (selection) => {
  401. console.log('选中要领出的印版:', selection)
  402. if (selection.length === 0) {
  403. yblyselectedvalue.value = null // 取消勾选时设为 null
  404. } else {
  405. yblyselectedvalue.value = {
  406. inventoryCodes: selection.map(item => item.存货编码),
  407. batchNumbers: selection.map(item => item.供方批号),
  408. GDUID:selection.map(item => item.GDUID)
  409. }
  410. }
  411. console.log('选中的数据:', yblyselectedvalue.value)
  412. }
  413. const onout = async () => {
  414. dialogPlateVisible.value = true;
  415. console.log(userStore.userInfo.nickName)
  416. }
  417. const onwithdraw = async () => {
  418. dialogwithdrawVisible.value = true;
  419. }
  420. // 退回操作
  421. const rawenterDialog = async () => {
  422. try {
  423. await ElMessageBox.confirm('确定收回吗', '提示', {
  424. confirmButtonText: '确定',
  425. cancelButtonText: '取消',
  426. type: 'warning'
  427. })
  428. console.log(yblyselectedvalue.value)
  429. const gduidArray = yblyselectedvalue.value.GDUID || [];
  430. const selectedIds = gduidArray.join(',');
  431. // 调用收回API,假设是批量删除接口
  432. const res = await PrintDetailEdit({ id: selectedIds,number:Plate.印数})
  433. if (res.code === 0) {
  434. ElMessage.success('收回成功')
  435. data_refresh()
  436. rawcloseDialog()
  437. on_search()
  438. // 清空选中
  439. selectedIds.value = []
  440. } else {
  441. ElMessage.error(res.msg || '收回失败')
  442. }
  443. } catch (error) {
  444. }
  445. }
  446. const rawcloseDialog = async () => {
  447. // const res = await getPPList({code:nodecode.value,page:page.value,limit:pageSize.value,key:'1'})
  448. // if (res.code === 0){
  449. // total.value = res.data.total
  450. // wltableData.value = res.data.data
  451. // }else{
  452. // total.value = 0
  453. // wltableData.value = []
  454. // wlmxtableData.value = []
  455. // }
  456. Plate.印数 = ''
  457. dialogwithdrawVisible.value = false
  458. }
  459. // 打开工单选择弹窗
  460. const openOrderSelectDialog = async () => {
  461. try {
  462. if(!Plate.工单编号){
  463. ElMessage.error('请先输入工单编号')
  464. return
  465. }
  466. const res = await getOrderInfo({ order: Plate.工单编号 });
  467. // 如果 res.msg 是 "参数错误",不处理
  468. if (res.msg === "参数错误") {
  469. return; // 直接返回,不弹任何提示
  470. }
  471. // 正常逻辑
  472. if (res.data?.length > 0) {
  473. orderList.value = res.data;
  474. orderSelectDialogVisible.value = true;
  475. nextTick(() => {
  476. if (orderList.value.length > 0) {
  477. orderTableRef.value.setCurrentRow(orderList.value[0]);
  478. selectedOrder.value = orderList.value[0];
  479. orderTableRef.value.$el.querySelector('.el-table__body-wrapper').focus();
  480. }
  481. });
  482. } else {
  483. ElMessage.warning('未找到相关工单信息'); // 只在这里提示
  484. }
  485. } catch (error) {
  486. ElMessage.error('获取工单信息失败: ' + error.message);
  487. }
  488. };
  489. // 处理工单选择
  490. const handleOrderSelect = (row) => {
  491. selectedOrder.value = row
  492. }
  493. // 确认工单选择
  494. const confirmOrderSelection = () => {
  495. if (selectedOrder.value) {
  496. Plate.印件号 = selectedOrder.value.yj_Yjno
  497. Plate.产品名称 = selectedOrder.value.Gd_cpmc
  498. orderSelectDialogVisible.value = false
  499. } else {
  500. ElMessage.warning('请选择一条工单记录')
  501. }
  502. }
  503. // 打开机台选择弹窗
  504. const openMachineSelectDialog = async () => {
  505. try {
  506. const res = await gdzl_MachineList({ address: Plate.车间 })
  507. if (res.code === 0 && res.data.length > 0) {
  508. machineList.value = res.data.map(item => ({ value: item }))
  509. machineSelectDialogVisible.value = true
  510. // 默认选中第一条并聚焦表格
  511. nextTick(() => {
  512. if (machineList.value.length > 0) {
  513. machineTableRef.value.setCurrentRow(machineList.value[0])
  514. selectedMachine.value = machineList.value[0]
  515. // 聚焦表格以便响应键盘事件
  516. machineTableRef.value.$el.querySelector('.el-table__body-wrapper').focus()
  517. }
  518. })
  519. } else {
  520. ElMessage.warning('未找到相关机台信息')
  521. }
  522. } catch (error) {
  523. ElMessage.error('获取机台信息失败: ' + error.message)
  524. }
  525. }
  526. // 处理机台选择
  527. const handleMachineSelect = (row) => {
  528. selectedMachine.value = row
  529. }
  530. // 确认机台选择
  531. const confirmMachineSelection = () => {
  532. if (selectedMachine.value) {
  533. console.log(selectedMachine.value)
  534. Plate.机台备注 = selectedMachine.value.value.split('--')[0]
  535. machineSelectDialogVisible.value = false
  536. } else {
  537. ElMessage.warning('请选择一个机台')
  538. }
  539. }
  540. const initialPlateState = {
  541. 工单编号: '',
  542. 印件号: '',
  543. 产品名称: '',
  544. 机台备注: '',
  545. value: [],
  546. };
  547. // 其他原有方法保持不变
  548. const dhlcloseDialog = () => {
  549. Object.assign(Plate, initialPlateState);
  550. dialogPlateVisible.value = false
  551. }
  552. const dhlenterDialog = () => {
  553. // 确定按钮逻辑
  554. if (!yblyselectedvalue.value.inventoryCodes || yblyselectedvalue.value.inventoryCodes.length === 0) {
  555. console.error('没有选中的印版数据')
  556. return
  557. }
  558. // 构建多条数据参数
  559. const paramsList = yblyselectedvalue.value.inventoryCodes.map((code, index) => ({
  560. gdbh: Plate.工单编号,
  561. yjno: Plate.印件号,
  562. machine: Plate.机台备注,
  563. code: code,
  564. batch: yblyselectedvalue.value.batchNumbers[index],
  565. sys_id: sys_id
  566. }))
  567. console.log('准备上传的参数列表:', paramsList)
  568. getPPgdReceive(paramsList).then(res=>{
  569. if(res.code===0){
  570. ElMessage.success('领出成功')
  571. dialogPlateVisible.value = false
  572. dhlcloseDialog()
  573. data_refresh()
  574. on_search()
  575. }else{
  576. ElMessage.error(res.msg)
  577. }
  578. })
  579. dialogPlateVisible.value = false
  580. }
  581. const selectedIds = ref('')
  582. // 下方表格选择变化
  583. const wlmxSelectionChange = (selection) => {
  584. selectedIds.value = selection.map(item => item.UniqID).join(',')
  585. console.log('选中的ID:', selectedIds.value)
  586. }
  587. // 删除操作
  588. const on_delete = async () => {
  589. if (!selectedIds.value.length) {
  590. ElMessage.warning('请先选择要删除的记录')
  591. return
  592. }
  593. try {
  594. await ElMessageBox.confirm('确定要删除选中的记录吗?', '提示', {
  595. confirmButtonText: '确定',
  596. cancelButtonText: '取消',
  597. type: 'warning'
  598. })
  599. // 调用删除API,假设是批量删除接口
  600. const res = await getPPDelete({ id: selectedIds.value,})
  601. if (res.code === 0) {
  602. ElMessage.success('删除成功')
  603. data_refresh()
  604. // 删除成功后刷新表格数据
  605. // 清空选中
  606. selectedIds.value = []
  607. } else {
  608. ElMessage.error(res.msg || '删除失败')
  609. }
  610. } catch (error) {
  611. if (error !== 'cancel') {
  612. console.error('删除失败:', error)
  613. ElMessage.error('删除操作已取消')
  614. }
  615. }
  616. }
  617. const gdbh = ref('')
  618. const jjcp_yjno = ref('')
  619. const gdtableRowClick = async (row) => {
  620. gdbh.value = row.工单编号
  621. jjcp_yjno.value = row.印件号
  622. }
  623. const ToExcel = () => {
  624. if(showKH.value === false){
  625. console.log('导出版材')
  626. const el = document.getElementById('wltable');
  627. const filename = '工单印版导出.xlsx';
  628. // 1. 获取原始表格数据
  629. const wb = XLSX.utils.table_to_book(el, { raw: true });
  630. const ws = wb.Sheets[wb.SheetNames[0]];
  631. // 2. 定义需要转换为数字的列(基于原始列字母)
  632. const numberColumns = {
  633. 'F': 2,
  634. 'G': 0,
  635. 'H': 2,
  636. };
  637. // 3. 转换数字格式
  638. Object.keys(ws).forEach(address => {
  639. const col = address.charAt(0);
  640. if (numberColumns[col] !== undefined) {
  641. const cell = ws[address];
  642. const num = parseFloat(cell.v);
  643. if (!isNaN(num)) {
  644. cell.t = 'n';
  645. cell.v = num;
  646. cell.z = numberColumns[col] === 0
  647. ? '0'
  648. : `0.${'0'.repeat(numberColumns[col])}`;
  649. }
  650. }
  651. });
  652. // 4. 导出
  653. const wbout = XLSX.write(wb, { bookType: 'xlsx', bookSST: true, type: 'array' });
  654. try {
  655. FileSaver.saveAs(new Blob([wbout], { type: 'application/octet-stream' }), filename);
  656. } catch (e) {
  657. console.error('导出失败:', e);
  658. }
  659. return wbout;
  660. }
  661. }
  662. //键盘input框跳转
  663. const entskip = async (event,id1,id2,id3,idx) => {
  664. if(event.keyCode === 40){
  665. if(id3!=''){
  666. document.getElementById(id3).focus()
  667. }
  668. }else if (event.keyCode === 13) { // Enter 或向下箭头
  669. if(id3!=''){
  670. document.getElementById(id3).focus()
  671. }
  672. } else if (event.keyCode === 38) { // 向上箭头
  673. if(id1!=''){
  674. console.log(id1)
  675. document.getElementById(id1).focus()
  676. }
  677. }else if (event.keyCode === 8) { // 删除箭头
  678. if(id1!='' && document.getElementById(id2).value==''){
  679. document.getElementById(id1).focus()
  680. }
  681. }else if (event.keyCode === 37) { // 向左箭头
  682. if(id1!='' && document.getElementById(id2).selectionStart==0){
  683. document.getElementById(id1).focus()
  684. }
  685. }else if (event.keyCode === 39) { // 向右箭头
  686. if(id3!='' && document.getElementById(id2).selectionStart == document.getElementById(id2).value.length){
  687. document.getElementById(id3).focus()
  688. }
  689. }
  690. }
  691. const handleKeyDown = async (event) => {
  692. entskip(event, '', '工单编号', '机台备注'); // 再执行同步操作
  693. openOrderSelectDialog(event); // 先执行异步操作
  694. };
  695. const rowClassStyle = ({row, rowIndex}) => {
  696. // 先检查clickedRow.value是否存在
  697. if (!clickedRow.value || !row['存货编码']) return ''
  698. // 然后比较两者的存货编码是否相同
  699. if (row['存货编码'] == clickedRow.value.存货编码) {
  700. return "warning-row"
  701. }
  702. return ''
  703. }
  704. </script>
  705. <style scoped>
  706. .form-container {
  707. display: flex;
  708. flex-wrap: wrap;
  709. }
  710. .form-column {
  711. /*flex: 1;*/
  712. margin-right: 15px; /* 调整列之间的间距 */
  713. }
  714. /* 左侧输入框宽度调整 */
  715. .form-column .el-form-item .el-input {
  716. width: 150px; /* 调整左侧输入框的宽度 */
  717. }
  718. :deep(.hui-plan-usage-lows div) {
  719. color: #8c939d !important;
  720. }
  721. :deep(.lan-plan-usage-lows div) {
  722. color: blue !important;
  723. font-weight: bold;
  724. }
  725. /* 媒体查询,根据需要调整断点 */
  726. @media screen and (max-width: 768px) {
  727. .form-column {
  728. flex: 1 0 100%; /* 在小屏幕下变成单列布局 */
  729. margin-right: 0;
  730. }
  731. }
  732. /*:deep(.el-table td .cell) {*/
  733. /* line-height: 30px !important;*/
  734. /*}*/
  735. .JKWTree-container {
  736. display: flex;
  737. }
  738. .JKWTree-tree {
  739. /*width: 300px;*/
  740. background-color: #fff;
  741. padding: 10px;
  742. margin-right: 20px;
  743. }
  744. .JKWTree-tree h3 {
  745. font-size: 15px;
  746. font-weight: 700;
  747. margin: 10px 0;
  748. }
  749. .JKWTree-content {
  750. flex: 1;
  751. }
  752. :deep(.el-table__body .warning-row) {
  753. background: #FFFF80 !important;
  754. }
  755. /* 选中某行时的背景色 */
  756. :deep(.el-table__body tr.current-row) > td {
  757. background: #ff80ff !important;
  758. }
  759. </style>
  760. <style scoped>
  761. :deep(.el-table td .cell) {
  762. line-height: 20px !important;
  763. }
  764. :deep(.el-tabs__header){
  765. margin-bottom: 0;
  766. }
  767. .search{
  768. margin-left: 0px !important;
  769. margin-right: 10px !important;
  770. }
  771. .bt{
  772. margin-left: 2px !important;
  773. padding: 3px !important;
  774. font-size: 12px;
  775. }
  776. .el-tabs__header{
  777. margin: 0px !important;
  778. }
  779. .gva-table-box{
  780. padding: 0px !important;
  781. }
  782. .mab{
  783. margin-bottom: 5px;
  784. }
  785. </style>