PrintingPlateRequisition.vue 24 KB

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