index.vue 37 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145114611471148114911501151115211531154115511561157115811591160116111621163116411651166116711681169117011711172117311741175117611771178117911801181118211831184118511861187118811891190119111921193119411951196119711981199120012011202120312041205120612071208120912101211121212131214121512161217121812191220122112221223122412251226122712281229123012311232123312341235123612371238123912401241124212431244124512461247124812491250125112521253125412551256125712581259126012611262126312641265126612671268126912701271127212731274127512761277127812791280128112821283128412851286128712881289129012911292129312941295129612971298129913001301130213031304130513061307
  1. <template>
  2. <div>
  3. <!-- 左侧树侧形结构-->
  4. <el-container>
  5. <layout-sider :resize-directions="['right']" :width="220" style="margin-right: 10px;">
  6. <div class="JKWTree-tree" style="height: 70vh;">
  7. <h3>包装计件单据维护</h3>
  8. <el-tree :data="treeData" highlight-current @node-click="handleNodeClick" />
  9. </div>
  10. </layout-sider>
  11. <el-container>
  12. <el-main>
  13. <!-- 按钮 -->
  14. <div class="gva-table-box">
  15. <el-form>
  16. <el-form-item>
  17. <el-input v-model="searchInfo" placeholder="搜索产品编号或产品名称" clearable style="width: 180px;" />
  18. <el-button type="primary" icon="Search" class="search" @click="handleSearch" />
  19. <el-button type="primary" icon="edit" class="bt" @click="handleShowDetail">查改</el-button>
  20. <el-button type="primary" icon="edit" class="bt" @click="handleShowAdd">新增</el-button>
  21. <el-button type="primary" icon="delete" class="bt" @click="handleDelete">删除</el-button>
  22. </el-form-item>
  23. </el-form>
  24. <!-- 数据展示 -->
  25. <el-table ref="table" style="width: 100%" :data="tableData" row-key="ID" highlight-current-row
  26. border show-overflow-tooltip :row-style="{ height: '20px' }"
  27. :cell-style="{ padding: '0px' }" :header-row-style="{ height: '20px' }"
  28. :header-cell-style="{ padding: '0px' }" @row-dblclick="handleShowDetail"
  29. @current-change="(row, oldRow) => { currentRow = row}">
  30. <el-table-column type="selection" width="55" />
  31. <!-- 循环渲染列 -->
  32. <el-table-column v-for=" column in tableColumns " :key="column.prop" :prop="column.prop"
  33. :label="column.label" width="110" sortable />
  34. </el-table>
  35. <!-- 分页 -->
  36. <div class="gva-pagination">
  37. <el-pagination v-model:current-page="page" v-model:page-size="limit"
  38. layout="total, sizes, prev, pager, next, jumper" :page-sizes="[10, 30, 50, 100]"
  39. :total="total" @current-change="handleCurrentChange" @size-change="handleSizeChange" />
  40. </div>
  41. </div>
  42. <el-dialog v-model="BzVisible" title="选择" destroy-on-close width="200px"
  43. @keydown="selectBZ($event)">
  44. <el-table tooltip-effect="dark" :data="selectDataBz" row-key="ID"
  45. highlight-current-row="true" border style="width:100%" @row-dblclick="SelectClickBz"
  46. ref="table">
  47. <el-table-column prop="sczl_bzdh" label="班组" width="150" />
  48. </el-table>
  49. </el-dialog>
  50. <el-dialog v-model="BzVisible2" title="冲月定额" destroy-on-close width="200px"
  51. @keydown="selectCY($event)">
  52. <el-table tooltip-effect="dark" :data="selectDataCY" row-key="ID"
  53. highlight-current-row="true" border style="width:100%" @row-dblclick="SelectClickCY"
  54. ref="table" :row-style="{ height: '30px' }" >
  55. <el-table-column prop="sczl_冲定额" label="冲月定额" width="150" />
  56. </el-table>
  57. </el-dialog>
  58. <!-- 弹出框 -->
  59. <div>
  60. <el-dialog v-model="dialogFormVisible" :title="type" destroy-on-close width="1400px">
  61. <el-form id="detail-form" :model="detailData" inline label-position="left"
  62. @keyup="moveFocus">
  63. <el-form-item label="日期">
  64. <el-input type="date" max="9999-12-31" @focus="rqHandleFocus()"
  65. v-model="detailData.sczl_rq" style="width: 120px;" />
  66. </el-form-item>
  67. <el-form-item label="员工编号">
  68. <el-input v-model="detailData.sczl_bh" style="width: 100px;"
  69. placeholder="Enter回车"
  70. />
  71. <el-input v-model="detailData.name" style="width: 100px; padding-left: 5px;"
  72. @click="selectvalue($event)" readonly />
  73. </el-form-item>
  74. <el-form-item label="组别">
  75. <!-- <el-select v-model="detailData.sczl_bzdh" placeholder=" " style="width: 80px" >
  76. <el-option label="A班" value="A班" />
  77. <el-option label="B班" value="B班" />
  78. </el-select> -->
  79. <el-input v-model="detailData.sczl_bzdh" style="width: 80px;" @keydown="getBzsubmit($event)" />
  80. </el-form-item>
  81. <br>
  82. <el-form-item label="计时时数" style="padding-left: 195px;">
  83. <el-input v-model="detailData.sczl_jsss" style="width: 100px;"
  84. @click="selectvalue($event)" />
  85. </el-form-item>
  86. <el-form-item label="冲月定额">
  87. <!-- <el-select v-model="detailData.sczl_冲定额" placeholder=" " style="width: 100px">
  88. <el-option label="" value="" />
  89. <el-option label="是" value="是" />
  90. </el-select> -->
  91. <el-input v-model="detailData.sczl_冲定额" style="width: 80px;" @keydown="getBzsubmit2($event)" />
  92. </el-form-item>
  93. <el-table :data="detailData.table" border tooltip-effect="dark"
  94. :row-style="{ height: '20px' }" :cell-style="{ padding: '0px' }"
  95. :header-row-style="{ height: '20px' }" :header-cell-style="{ padding: '0px' }">
  96. <el-table-column label="工单编号" width="120">
  97. <template #default="{ row, $index }">
  98. <el-input v-model="row.sczl_gdbh" placeholder="Enter回车"
  99. @keyup.enter="handleEnter($index, row)" @keyup ="movefous($event,row)" />
  100. </template>
  101. </el-table-column>
  102. <el-table-column label="印件工序" width="100">
  103. <template #default="{ row }">
  104. <el-input v-model="row.sczl_yjGx" readonly />
  105. </template>
  106. </el-table-column>
  107. <el-table-column label="工序名称" width="100">
  108. <template #default="{ row }">
  109. <el-input v-model="row.sczl_gxmc" readonly />
  110. </template>
  111. </el-table-column>
  112. <el-table-column label="印件名称" width="310">
  113. <template #default="{ row }">
  114. <el-input v-model="row.Gd_cpmc" readonly />
  115. </template>
  116. </el-table-column>
  117. <el-table-column label="核算标准">
  118. <template #default="{ row }">
  119. <el-select v-model="row.hsbz" placeholder="请选择">
  120. <el-option label="1000" value="1000"></el-option>
  121. <el-option label="2500" value="2500"></el-option>
  122. </el-select>
  123. </template>
  124. </el-table-column>
  125. <el-table-column label="包装产量" width="100">
  126. <template #default="{ row }">
  127. <el-input v-model="row.sczl_cl" />
  128. </template>
  129. </el-table-column>
  130. <el-table-column label="返工产量" width="95">
  131. <template #default="{ row }">
  132. <el-input v-model="row.sczl_返工产量" />
  133. </template>
  134. </el-table-column>
  135. <el-table-column label="每箱数量" width="100">
  136. <template #default="{ row }">
  137. <el-input v-model="row.sczl_PgCl" />
  138. </template>
  139. </el-table-column>
  140. <el-table-column label="计产系数" width="95">
  141. <template #default="{ row }">
  142. <el-input v-model="row.sczl_计产系数" />
  143. </template>
  144. </el-table-column>
  145. <el-table-column label="来源" width="95">
  146. <template #default="{ row }">
  147. <el-input v-model="row.sczl_Jtbh1"
  148. @keyup ="movefous2($event,row)"/>
  149. </template>
  150. </el-table-column>
  151. <el-table-column label="定额代号" width="130">
  152. <template #default="{ row, $index }">
  153. <el-input id="input" v-model="row.sczl_dedh"
  154. @keyup.enter="getDedhsubmit($index, row)" />
  155. </template>
  156. </el-table-column>
  157. </el-table>
  158. <el-form-item label="其他备注" style="margin-top: 10px;">
  159. <el-input v-model="detailData.sczl_desc" />
  160. </el-form-item>
  161. </el-form>
  162. <template #footer>
  163. <div class="dialog-footer">
  164. <el-button @click="dialogFormVisible = false">取 消</el-button>
  165. <el-button type="primary" @click="enterDialog">确 定
  166. </el-button>
  167. </div>
  168. </template>
  169. </el-dialog>
  170. <!-- 新增定额代号 -->
  171. <el-dialog v-model="dedhsearchModel" :before-close="() => dedhsearchModel = false" @opened="focusFirstNode">
  172. <el-form>
  173. <div>
  174. <el-form-item label="定额代号 :" class="mab" prop="keyOrder">
  175. </el-form-item>
  176. <div style="border:1px solid #eee; width:100%; height: 400px; overflow-y: auto">
  177. <el-tree ref="table_dedh" node-key="id" :data="dedhtreeData" :props="{
  178. children: 'children',
  179. label: 'label',
  180. }" @node-click="dedhhandleNodeClick"></el-tree>
  181. </div>
  182. </div>
  183. </el-form>
  184. </el-dialog>
  185. <!-- 弹出选项框 -->
  186. <el-dialog v-model="dialogSelectVisible" title="选择" destroy-on-close width="800px"
  187. @keydown="selectCP($event)">
  188. <el-table tooltip-effect="dark" :data="selectData" row-key="ID" highlight-current-row border
  189. style="width:100%" @row-dblclick="handleSelectClick" ref="table2">
  190. <el-table-column prop="Gd_cpmc" label="产品名称" width="460" />
  191. <el-table-column prop="Gy0_gxmc" label="工序" width="200" />
  192. <el-table-column prop="jyGx" label="工序编号" width="100" />
  193. </el-table>
  194. </el-dialog>
  195. </div>
  196. <!-- 员工选择 -->
  197. <el-dialog v-model="dialogSelectVisible_Yg" title="选择" destroy-on-close width="300px"
  198. @keydown="selectGX_Yg($event)">
  199. <el-table tooltip-effect="dark" :data="selectData_Yg" row-key="ID" highlight-current-row="true"
  200. border style="width:100%" @row-dblclick="handleSelectClick_Yg" ref="table_Yg">
  201. <el-table-column prop="员工编号" label="员工编号" width="100" />
  202. <el-table-column prop="ygxm" label="员工姓名" width="200" />
  203. </el-table>
  204. </el-dialog>
  205. <!-- 班组选择 -->
  206. <el-dialog v-model="dialogSelectVisible_Bz" title="选择" destroy-on-close width="200px"
  207. @keydown="selectGX_Bz($event)">
  208. <el-table tooltip-effect="dark" :data="selectData_Bz" row-key="ID" highlight-current-row="true"
  209. border style="width:100%" @row-dblclick="handleSelectClick_Bz" ref="table_Bz">
  210. <el-table-column prop="sczl_bzdh" label="班组" width="160" />
  211. </el-table>
  212. </el-dialog>
  213. </el-main>
  214. </el-container>
  215. </el-container>
  216. </div>
  217. </template>
  218. <script>
  219. </script>
  220. <script setup>
  221. import {
  222. Layout,
  223. LayoutContent,
  224. LayoutHeader,
  225. LayoutSider
  226. } from '@arco-design/web-vue'
  227. import {
  228. ElMessage,
  229. ElMessageBox,
  230. dayjs
  231. } from 'element-plus'
  232. // import { Download, Search, Delete } from '@element-plus/icons-vue'
  233. import {
  234. reactive,
  235. ref,
  236. nextTick,
  237. onMounted
  238. } from 'vue'
  239. import {
  240. getGxMc,
  241. getInfo,
  242. getLocate,
  243. getPackingSideTable,
  244. getPackingTable,
  245. updatePackingTable,
  246. getYg,
  247. DeletePackingTable,
  248. addPackingTable,
  249. getDedh
  250. } from '@/api/mes_api_gty/myapi'
  251. import {
  252. useUserStore
  253. } from '@/pinia/modules/user'
  254. const userStore = useUserStore()
  255. const sys_id = '[' + userStore.userInfo.userName + '/' + userStore.userInfo.nickName + ']'
  256. defineOptions({
  257. name: '06PackingDocuments',
  258. })
  259. //班组
  260. const BzVisible = ref (false)
  261. //
  262. const BzVisible2 = ref (false)
  263. const selectDataBz = reactive([])
  264. const selectDataCY = reactive([])
  265. const SelectClickBz = (row, column, event) => {
  266. detailData.sczl_bzdh = row.sczl_bzdh
  267. BzVisible.value = false
  268. }
  269. const selectBZ = (event) => {
  270. if (event.keyCode === 40) { // Enter 或向下箭头
  271. setCurrent(selectDataBz[1]);
  272. } else if (event.keyCode === 38) {
  273. setCurrent(selectDataBz[0]);
  274. } else if (event.keyCode === 13) {
  275. BzVisible.value = false
  276. }
  277. }
  278. const selectCY = (event) => {
  279. if (event.keyCode === 40) { // Enter 或向下箭头
  280. setCurrent2(selectDataCY[1]);
  281. } else if (event.keyCode === 38) {
  282. setCurrent2(selectDataCY[0]);
  283. } else if (event.keyCode === 13) {
  284. BzVisible2.value = false
  285. }
  286. }
  287. const SelectClickCY = (row, column, event) => {
  288. detailData.sczl_冲定额 = row.sczl_冲定额
  289. BzVisible2.value = false
  290. }
  291. // 侧边栏功能
  292. const treeData = reactive([])
  293. const getSideData = async () => {
  294. try {
  295. const response = await getPackingSideTable()
  296. if (response.code === 0) {
  297. const transformedData = response.data.map(item => ({
  298. label: `${item.date.replace(/-/g, '.')}【单据数: ${item.counts}张】`,
  299. children: item.sys.map(sysItem => ({
  300. label: `${sysItem.sys_id} 【记录数: ${sysItem.count}张】`,
  301. params: {
  302. date: item.date.replace(/\./g, '-'),
  303. sys_id: sysItem.sys_id,
  304. },
  305. })),
  306. }))
  307. treeData.splice(0, treeData.length, ...transformedData)
  308. }
  309. } catch (e) {
  310. console.log(e)
  311. }
  312. }
  313. getSideData()
  314. // 表格功能
  315. const tableColumns = [{
  316. label: '员工编号',
  317. prop: 'sczl_bh',
  318. width: '100'
  319. },
  320. {
  321. label: '员工姓名',
  322. prop: 'name',
  323. width: '100'
  324. },
  325. {
  326. label: '生产日期',
  327. prop: 'sczl_rq',
  328. width: '100'
  329. },
  330. {
  331. label: '班组',
  332. prop: 'sczl_bzdh',
  333. width: '100'
  334. },
  335. {
  336. label: '包装产量',
  337. prop: 'sczl_cl',
  338. width: '100'
  339. },
  340. {
  341. label: '返工产量',
  342. prop: 'sczl_fgsl',
  343. width: '100'
  344. },
  345. {
  346. label: '计件产量',
  347. prop: 'sczl_jjcl',
  348. width: '100'
  349. },
  350. {
  351. label: '相关工单',
  352. prop: 'sczl_gdbh1',
  353. width: '100'
  354. },
  355. {
  356. label: '创建用户',
  357. prop: 'sys_id',
  358. width: '120'
  359. },
  360. {
  361. label: '创建时间',
  362. prop: 'sys_rq',
  363. width: '180'
  364. },
  365. {
  366. label: '修改时间',
  367. prop: 'mod_rq',
  368. width: '180'
  369. },
  370. {
  371. label: 'UNIQID',
  372. prop: 'UniqId',
  373. width: '100'
  374. },
  375. ]
  376. const tableData = reactive([])
  377. const params = {
  378. type: '',
  379. date: '',
  380. sys_id: '',
  381. gdbh: '',
  382. }
  383. const total = ref(0)
  384. const page = ref(1)
  385. const limit = ref(10)
  386. const type = ref('')
  387. const searchInfo = ref('')
  388. const currentRow = ref({})
  389. // const multipleSelection = ref([])
  390. // 获取列表数据
  391. const getTableData = async () => {
  392. try {
  393. const response = await getPackingTable({
  394. date: params.date,
  395. sys_id: params.sys_id,
  396. page: page.value.toString(),
  397. limit: limit.value.toString(),
  398. })
  399. if (response.code === 0) {
  400. total.value = response.data.total
  401. tableData.splice(0, tableData.length, ...response.data.rows)
  402. setCurrent(tableData[0])
  403. }
  404. } catch (e) {
  405. console.log(e)
  406. }
  407. }
  408. // 获取定位数据
  409. const getLocateTable = async () => {
  410. try {
  411. const response = await getLocate({
  412. gdbh: params.gdbh,
  413. page: page.value.toString(),
  414. limit: limit.value.toString(),
  415. })
  416. if (response.code === 0) {
  417. total.value = response.data.total
  418. tableData.splice(0, tableData.length, ...response.data.rows)
  419. }
  420. } catch (e) {
  421. console.log(e)
  422. }
  423. }
  424. // 删除数据
  425. const deleteTableData = async (id) => {
  426. try {
  427. const res = await DeletePackingTable({
  428. UniqId: id
  429. })
  430. if (res.code === 0) {
  431. return 0
  432. }
  433. } catch (e) {
  434. console.log(e)
  435. }
  436. }
  437. const handleNodeClick = (node, check) => {
  438. if (node.params) {
  439. params.date = node.params.date
  440. params.sys_id = node.params.sys_id
  441. params.type = 'getTableData'
  442. page.value = 1
  443. getTableData()
  444. }
  445. }
  446. const selectvalue = (e) => {
  447. console.log(e)
  448. e.currentTarget.select();
  449. }
  450. // 定位
  451. const handleSearch = () => {
  452. params.gdbh = searchInfo.value
  453. params.type = 'getLocateTable'
  454. page.value = 1
  455. getLocateTable()
  456. }
  457. // 查改
  458. const handleShowDetail = () => {
  459. type.value = '查改'
  460. console.log(currentRow.value)
  461. if (currentRow.value.UniqId == undefined) {
  462. ElMessage({
  463. type: 'warning',
  464. message: '未选中记录',
  465. })
  466. return
  467. } else {
  468. getTableInfo(currentRow.value?.UniqId)
  469. }
  470. }
  471. // 删除
  472. const handleDelete = () => {
  473. if (currentRow.value.UniqId == undefined) {
  474. ElMessage({
  475. type: 'warning',
  476. message: '未选中记录',
  477. })
  478. return
  479. }
  480. ElMessageBox.confirm(
  481. `确认删除这条数据么?`,
  482. '警告', {
  483. confirmButtonText: '确认',
  484. cancelButtonText: '取消',
  485. type: 'warning',
  486. }
  487. )
  488. .then(async () => {
  489. const ret = await deleteTableData(currentRow.value?.UniqId)
  490. if (ret === 0) {
  491. ElMessage({
  492. type: 'success',
  493. message: '删除成功',
  494. })
  495. getSideData()
  496. getTableData()
  497. } else {
  498. ElMessage({
  499. type: 'error',
  500. message: '删除失败',
  501. })
  502. }
  503. })
  504. .catch(() => {
  505. ElMessage({
  506. type: 'info',
  507. message: '取消删除',
  508. })
  509. })
  510. }
  511. // 分页
  512. // #region
  513. const handleSizeChange = () => {
  514. switch (params.type) {
  515. case 'getTableData':
  516. getTableData()
  517. break
  518. case 'getLocateTable':
  519. getLocateTable()
  520. break
  521. default:
  522. break
  523. }
  524. }
  525. const handleCurrentChange = () => {
  526. switch (params.type) {
  527. case 'getTableData':
  528. getTableData()
  529. break
  530. case 'getLocateTable':
  531. getLocateTable()
  532. break
  533. default:
  534. break
  535. }
  536. }
  537. // #endregion
  538. // 详情界面
  539. const detailData = reactive({
  540. UniqId: '',
  541. selectIndex: 0,
  542. sczl_rq: '',
  543. sczl_bh: '',
  544. name: '',
  545. sczl_bzdh: '',
  546. sczl_jsss: '',
  547. sczl_冲定额: '',
  548. sczl_desc: '',
  549. table: [],
  550. })
  551. const selectData = reactive([])
  552. const table = ref()
  553. // 弹窗控制标记
  554. const dialogFormVisible = ref(false)
  555. const dialogSelectVisible = ref(false)
  556. const setCurrent = (row) => {
  557. table.value?.setCurrentRow(row)
  558. detailData.sczl_bzdh = row.sczl_bzdh
  559. detailData.sczl_冲定额 = row.sczl_冲定额
  560. }
  561. const setCurrent2 = (row) => {
  562. table.value?.setCurrentRow(row)
  563. detailData.sczl_冲定额 = row.sczl_冲定额
  564. }
  565. // 获取详细信息
  566. const getTableInfo = async (id) => {
  567. try {
  568. const response = await getInfo({
  569. UniqId: id
  570. })
  571. if (response.code === 0) {
  572. const {
  573. sczl_rq,
  574. sczl_bh,
  575. name,
  576. sczl_bzdh,
  577. sczl_jsss,
  578. sczl_冲定额,
  579. sczl_desc,
  580. ...rest
  581. } = response.data
  582. Object.assign(detailData, {
  583. sczl_rq,
  584. sczl_bh,
  585. name,
  586. sczl_bzdh,
  587. sczl_jsss,
  588. sczl_冲定额,
  589. sczl_desc
  590. })
  591. detailData.table = Array.from({
  592. length: 6
  593. }, (_, i) => i + 1)
  594. .map(num => {
  595. return {
  596. sczl_gdbh: rest[`sczl_gdbh${num}`],
  597. sczl_yjGx: rest[`sczl_yjGx${num}`],
  598. sczl_gxmc: rest[`sczl_gxmc${num}`],
  599. Gd_cpmc: rest[`Gd_cpmc${num}`],
  600. sczl_cl: rest[`sczl_cl${num}`],
  601. hsbz:rest[`sczl_type${num}`],
  602. sczl_返工产量: rest[`sczl_返工产量${num}`],
  603. sczl_PgCl: rest[`sczl_PgCl${num}`],
  604. sczl_计产系数: rest[`sczl_计产系数${num}`],
  605. sczl_Jtbh1: rest[`sczl_Jtbh${num}`],
  606. sczl_dedh: rest[`sczl_dedh${num}`],
  607. }
  608. })
  609. if (type.value === '新增') {
  610. console.log(detailData)
  611. // detailData.name = ''
  612. // detailData.sczl_bh = ''
  613. // detailData.sczl_bzdh = ''
  614. // detailData.sczl_desc = ''
  615. // detailData.sczl_jsss = ''
  616. // detailData.sczl_rq = ''
  617. detailData.table.forEach(row => {
  618. for (const key in row) {
  619. if ( key === 'sczl_cl'){
  620. row[key] = '' // 清空每行的内容
  621. }
  622. }
  623. })
  624. } else {
  625. detailData.UniqId = id
  626. dialogFormVisible.value = true
  627. }
  628. if (type.value === '新增' || type.value === '查改') {
  629. detailData.UniqId = id
  630. dialogFormVisible.value = true
  631. // 在 setTimeout 中获取元素,确保在 DOM 渲染完毕后执行
  632. setTimeout(() => {
  633. formElements = document.getElementById('detail-form').elements
  634. formElements[0].focus()
  635. }, 0)
  636. }
  637. }
  638. } catch (e) {
  639. console.log(e)
  640. }
  641. }
  642. //日期获得焦点事件
  643. const rqHandleFocus = () => {
  644. if (detailData.sczl_rq == '') {
  645. detailData.sczl_rq = new Date().toISOString().split('T')[0]
  646. }
  647. }
  648. // 获取工序名称
  649. const getTableGxMc = async (index, row) => {
  650. try {
  651. const response = await getGxMc({
  652. gdbh: row.sczl_gdbh
  653. })
  654. if (response.code === 0) {
  655. const {
  656. Gd_cpmc,
  657. Gy0_gxmc,
  658. jyGx
  659. } = response.data[0]
  660. if (response.data.length === 1) {
  661. detailData.table[index].Gd_cpmc = Gd_cpmc
  662. detailData.table[index].sczl_yjGx = jyGx
  663. detailData.table[index].sczl_gxmc = Gy0_gxmc
  664. } else {
  665. selectData.splice(0, selectData.length, ...response.data)
  666. setCPCurrent(selectData[0])
  667. detailData.selectIndex = index
  668. dialogSelectVisible.value = true
  669. }
  670. }
  671. } catch (e) {
  672. console.log(e)
  673. }
  674. }
  675. // 更新数据
  676. const updateDetailData = async () => {
  677. const restoredData = {
  678. UniqId: detailData.UniqId,
  679. sczl_rq: detailData.sczl_rq,
  680. sczl_bh: detailData.sczl_bh,
  681. name: detailData.name,
  682. sczl_bzdh: detailData.sczl_bzdh,
  683. sczl_jsss: detailData.sczl_jsss,
  684. sczl_冲定额: detailData.sczl_冲定额,
  685. sczl_desc: detailData.sczl_desc,
  686. }
  687. detailData.table.forEach((item, index, array) => {
  688. const num = index + 1
  689. restoredData[`sczl_gdbh${num}`] = item.sczl_gdbh
  690. restoredData[`sczl_yjGx${num}`] = item.sczl_yjGx
  691. restoredData[`sczl_gxmc${num}`] = item.sczl_gxmc
  692. restoredData[`sczl_type${num}`] = item.hsbz === undefined ? '' : item.hsbz;
  693. restoredData[`Gd_cpmc${num}`] = item.Gd_cpmc
  694. restoredData[`sczl_cl${num}`] = item.sczl_cl
  695. restoredData[`sczl_返工产量${num}`] = item.sczl_返工产量
  696. restoredData[`sczl_PgCl${num}`] = item.sczl_PgCl
  697. restoredData[`sczl_计产系数${num}`] = item.sczl_计产系数
  698. restoredData[`sczl_Jtbh${num}`] = item.sczl_Jtbh1
  699. restoredData[`sczl_dedh${num}`] = item.sczl_dedh
  700. })
  701. console.log(restoredData)
  702. // return false;
  703. const res = await updatePackingTable(restoredData)
  704. if (res.code === 0) {
  705. ElMessage({
  706. type: 'success',
  707. message: '更新成功',
  708. })
  709. dialogFormVisible.value = false
  710. }
  711. }
  712. // 新增数据
  713. const handleShowAdd = async () => {
  714. type.value = '新增'
  715. if (currentRow.value.UniqId == null) {
  716. detailData.table = Array.from({
  717. length: 6
  718. }, (_, i) => i + 1)
  719. .map(num => {
  720. return {
  721. sczl_gdbh: '',
  722. sczl_yjGx: '',
  723. sczl_gxmc: '',
  724. Gd_cpmc: '',
  725. sczl_cl: '',
  726. sczl_返工产量: '',
  727. sczl_PgCl: '',
  728. sczl_计产系数: '',
  729. sczl_Jtbh1: '',
  730. sczl_dedh: '',
  731. }
  732. })
  733. setTimeout(() => {
  734. formElements = document.getElementById('detail-form').elements
  735. formElements[0].focus()
  736. }, 0)
  737. dialogFormVisible.value = true
  738. } else {
  739. await getTableInfo(currentRow.value?.UniqId)
  740. // 默认日期为前一天的日期
  741. const date = dayjs().subtract(1, 'day').format('YYYY-MM-DD')
  742. detailData.sczl_rq = date
  743. }
  744. }
  745. const addDetailData = async () => {
  746. const restoredData = {
  747. sys_id: sys_id,
  748. sczl_rq: detailData.sczl_rq,
  749. sczl_bh: detailData.sczl_bh,
  750. // name: detailData.name,
  751. sczl_bzdh: detailData.sczl_bzdh,
  752. sczl_jsss: detailData.sczl_jsss,
  753. sczl_冲定额: detailData.sczl_冲定额,
  754. sczl_desc: detailData.sczl_desc,
  755. }
  756. detailData.table.forEach((item, index, array) => {
  757. const num = index + 1
  758. restoredData[`sczl_gdbh${num}`] = item.sczl_gdbh
  759. restoredData[`sczl_yjGx${num}`] = item.sczl_yjGx
  760. restoredData[`sczl_gxmc${num}`] = item.sczl_gxmc
  761. restoredData[`sczl_type${num}`] = item.hsbz === undefined ? '' : item.hsbz;
  762. // restoredData[`Gd_cpmc${num}`] = item.Gd_cpmc
  763. restoredData[`sczl_cl${num}`] = item.sczl_cl
  764. restoredData[`sczl_返工产量${num}`] = item.sczl_返工产量
  765. restoredData[`sczl_PgCl${num}`] = item.sczl_PgCl
  766. restoredData[`sczl_计产系数${num}`] = item.sczl_计产系数
  767. restoredData[`sczl_Jtbh${num}`] = item.sczl_Jtbh1
  768. restoredData[`sczl_dedh${num}`] = item.sczl_dedh
  769. })
  770. const res = await addPackingTable(restoredData)
  771. if (res.code === 0) {
  772. ElMessage({
  773. type: 'success',
  774. message: '新增成功',
  775. })
  776. dialogFormVisible.value = false
  777. if (params.date != '') {
  778. getTableData()
  779. }
  780. getSideData()
  781. }
  782. }
  783. //弹出框回车事件
  784. const handleGetYg = async () => {
  785. if (detailData.sczl_bh == '') {
  786. formElements = document.getElementById('detail-form').elements
  787. formElements[3].focus()
  788. formElements[3].select()
  789. return
  790. }
  791. try {
  792. const response = await getYg({ sczl_bh: detailData.sczl_bh })
  793. if (response.code == 0) {
  794. if (response.data.length == 1) {
  795. detailData.name = response.data[0].ygxm
  796. detailData.sczl_bh = response.data[0].员工编号
  797. detailData.sczl_jsss = "0"
  798. // detailData.sczl_冲定额 = "0"
  799. formElements = document.getElementById('detail-form').elements
  800. formElements[3].focus()
  801. formElements[3].select()
  802. } else if (response.data.length > 1) {
  803. selectData_Yg.splice(0, selectData_Yg.length, ...response.data)
  804. setGXCurrent_Yg(selectData_Yg[0])
  805. dialogSelectVisible_Yg.value = true
  806. } else {
  807. ElMessage({
  808. type: 'warning',
  809. message: '未查询到该员工'
  810. })
  811. detailData.name = ''
  812. detailData.sczl_bh = ''
  813. }
  814. } else {
  815. detailData.name = '';
  816. detailData.sczl_bh = '';
  817. }
  818. } catch (e) {
  819. console.log(e)
  820. }
  821. }
  822. const dialogSelectVisible_Yg = ref(false)
  823. const selectData_Yg = reactive([])
  824. // 处理选择框
  825. const handleSelectClick_Yg = (row, column, event) => {
  826. detailData.name = row.ygxm
  827. detailData.sczl_bh = row.员工编号
  828. dialogSelectVisible_Yg.value = false
  829. formElements = document.getElementById('detail-form').elements
  830. formElements[3].focus()
  831. formElements[3].select()
  832. }
  833. const currentIndex_Yg = ref(0);
  834. const GXCurrent_Yg = ref(0);
  835. const selectGX_Yg = (event) => {
  836. if (event.keyCode === 40) { // 向下箭头
  837. if (currentIndex_Yg.value < selectData_Yg.length - 1) {
  838. currentIndex_Yg.value++;
  839. setGXCurrent_Yg(selectData_Yg[currentIndex_Yg.value]);
  840. } else {
  841. currentIndex_Yg.value = 0;
  842. setGXCurrent_Yg(selectData_Yg[currentIndex_Yg.value]); // 到达最后一行时回到第一行
  843. }
  844. } else if (event.keyCode === 38) { // 向上箭头
  845. if (currentIndex_Yg.value > 0) {
  846. currentIndex_Yg.value--;
  847. setGXCurrent_Yg(selectData_Yg[currentIndex_Yg.value]);
  848. } else {
  849. currentIndex_Yg.value = selectData_Yg.length - 1;
  850. setGXCurrent_Yg(selectData_Yg[currentIndex_Yg.value]); // 到达第一行时回到最后一行
  851. }
  852. } else if (event.keyCode === 13) { // 回车键
  853. dialogSelectVisible_Yg.value = false;
  854. formElements = document.getElementById('detail-form').elements
  855. formElements[3].focus()
  856. formElements[3].select()
  857. }
  858. }
  859. const table_Yg = ref()
  860. const setGXCurrent_Yg = (row) => {
  861. setTimeout(() => {
  862. table_Yg.value?.setCurrentRow(row)
  863. detailData.name = row.ygxm
  864. detailData.sczl_bh = row.员工编号
  865. })
  866. }
  867. //班组回车事件
  868. const getBzsubmit = (event) => {
  869. if (event.keyCode !== 37){
  870. //弹出选择
  871. const data = [{
  872. 'sczl_bzdh': 'A班'
  873. }, {
  874. 'sczl_bzdh': 'B班'
  875. }]
  876. selectDataBz.splice(0, selectDataBz.length, ...data)
  877. if (dialogSelectVisible_Yg.value == false){
  878. BzVisible.value = true
  879. }
  880. setCurrent(data[0])
  881. }
  882. }
  883. //冲月定额
  884. const getBzsubmit2 = (event) => {
  885. if (event.keyCode !== 37) {
  886. const data = [{
  887. 'sczl_冲定额': ' '
  888. }, {
  889. 'sczl_冲定额': '否'
  890. }]
  891. selectDataCY.splice(0, selectDataCY.length, ...data)
  892. BzVisible2.value = true
  893. setCurrent2(data[0])
  894. }
  895. }
  896. const dialogSelectVisible_Bz = ref(false)
  897. const selectData_Bz = reactive([])
  898. // 处理选择框
  899. const handleSelectClick_Bz = (row, column, event) => {
  900. detailData.sczl_bzdh = row.sczl_bzdh
  901. dialogSelectVisible_Bz.value = false
  902. }
  903. const currentIndex_Bz = ref(0);
  904. const GXCurrent_Bz = ref(0);
  905. const selectGX_Bz = (event) => {
  906. if (event.keyCode === 40) { // 向下箭头
  907. if (currentIndex_Bz.value < selectData_Bz.length - 1) {
  908. currentIndex_Bz.value++;
  909. setGXCurrent_Bz(selectData_Bz[currentIndex_Bz.value]);
  910. } else {
  911. currentIndex_Bz.value = 0;
  912. setGXCurrent_Bz(selectData_Bz[currentIndex_Bz.value]); // 到达最后一行时回到第一行
  913. }
  914. } else if (event.keyCode === 38) { // 向上箭头
  915. if (currentIndex_Bz.value > 0) {
  916. currentIndex_Bz.value--;
  917. setGXCurrent_Bz(selectData_Bz[currentIndex_Bz.value]);
  918. } else {
  919. currentIndex_Bz.value = selectData_Bz.length - 1;
  920. setGXCurrent_Bz(selectData_Bz[currentIndex_Bz.value]); // 到达第一行时回到最后一行
  921. }
  922. } else if (event.keyCode === 13) { // 回车键
  923. dialogSelectVisible_Bz.value = false;
  924. }
  925. }
  926. const table_Bz = ref()
  927. const setGXCurrent_Bz = (row) => {
  928. setTimeout(() => {
  929. table_Bz.value?.setCurrentRow(row)
  930. detailData.sczl_bzdh = row.sczl_bzdh
  931. })
  932. }
  933. // 处理选择框回车操作
  934. const handleEnter = (index, row) => {
  935. detailData.table[index].sczl_dedh = '030002001'
  936. if (row.sczl_gdbh === '') {
  937. detailData.table[index].sczl_yjGx = ''
  938. detailData.table[index].sczl_gxmc = ''
  939. detailData.table[index].Gd_cpmc = ''
  940. } else {
  941. getTableGxMc(index, row)
  942. }
  943. }
  944. // 处理选择框
  945. const handleSelectClick = (row, column, event) => {
  946. const {
  947. Gd_cpmc,
  948. Gy0_gxmc,
  949. jyGx
  950. } = row
  951. const index = detailData.selectIndex
  952. detailData.table[index].Gd_cpmc = Gd_cpmc
  953. detailData.table[index].sczl_yjGx = jyGx
  954. detailData.table[index].sczl_gxmc = Gy0_gxmc
  955. dialogSelectVisible.value = false
  956. }
  957. const table2 = ref()
  958. const setCPCurrent = (row) => {
  959. setTimeout(() => {
  960. table2.value?.setCurrentRow(row)
  961. const {
  962. Gd_cpmc,
  963. Gy0_gxmc,
  964. jyGx
  965. } = row
  966. const index = detailData.selectIndex
  967. detailData.table[index].Gd_cpmc = Gd_cpmc
  968. detailData.table[index].sczl_yjGx = jyGx
  969. detailData.table[index].sczl_gxmc = Gy0_gxmc
  970. })
  971. }
  972. const CPIndex = ref(0);
  973. const JYCurrent = ref(0);
  974. const selectCP = (event) => {
  975. if (event.keyCode === 40) { // 向下箭头
  976. if (CPIndex.value < selectData.length - 1) {
  977. CPIndex.value++;
  978. setCPCurrent(selectData[CPIndex.value]);
  979. } else {
  980. CPIndex.value = 0;
  981. setCPCurrent(selectData[CPIndex.value]); // 到达最后一行时回到第一行
  982. }
  983. } else if (event.keyCode === 38) { // 向上箭头
  984. if (CPIndex.value > 0) {
  985. CPIndex.value--;
  986. setCPCurrent(selectData[CPIndex.value]);
  987. } else {
  988. CPIndex.value = selectData.length - 1;
  989. setCPCurrent(selectData[CPIndex.value]); // 到达第一行时回到最后一行
  990. }
  991. } else if (event.keyCode === 13) { // 回车键
  992. dialogSelectVisible.value = false
  993. }
  994. }
  995. // 弹窗确定
  996. const enterDialog = () => {
  997. if (type.value === '查改') {
  998. updateDetailData()
  999. } else if (type.value === '新增') {
  1000. addDetailData()
  1001. }
  1002. }
  1003. //新增定额代号
  1004. const dedhsearchModel = ref(false)
  1005. const dedhtreeData = ref([])
  1006. const table_dedh =ref()
  1007. const _index = ref(null)
  1008. // 定额代号回车事件
  1009. const getDedhsubmit = async (index, row) => {
  1010. if(detailData.table[index].sczl_dedh == '030002001'){
  1011. return
  1012. }
  1013. _index.value = index
  1014. dedhsearchModel.value = true;
  1015. const getPieceWorks = await getDedh();
  1016. console.log(getPieceWorks);
  1017. if (getPieceWorks.code === 0) {
  1018. const transformItems = (items,indexs) => {
  1019. return items.map((item,index) => ({
  1020. id: `${indexs}-${index}`,
  1021. label: `${item.sys_mc}【${item.sys_bh}】`,
  1022. params: {
  1023. code: item.sys_bh
  1024. },
  1025. children: item.bh_mc ? transformItems(item.bh_mc) : []
  1026. }));
  1027. };
  1028. const transformedData2 = getPieceWorks.data.map((topItem,indexs) => ({
  1029. id: indexs,
  1030. label: `${topItem.sys_mc}【${topItem.sys_bh}】`,
  1031. params: {
  1032. code: topItem.sys_bh
  1033. },
  1034. children: topItem.bh_mc ? transformItems(topItem.bh_mc,indexs) : []
  1035. }));
  1036. dedhtreeData.value = transformedData2;
  1037. console.log(transformedData2);
  1038. nextTick(() => {
  1039. // 手动设置选中节点,如果默认选中不生效,可以使用此方法
  1040. if (table_dedh.value) {
  1041. const tree = table_dedh.value?.$el; // 访问组件实例的 $el
  1042. if (tree) {
  1043. // 通过DOM选择器查找节点
  1044. const node = tree.querySelector('[data-key="0"]');
  1045. if (node) {
  1046. node.scrollIntoView();
  1047. node.focus(); // 假设节点是可聚焦的
  1048. }
  1049. }
  1050. }
  1051. });
  1052. }
  1053. };
  1054. // 点击定额代号
  1055. const dedhhandleNodeClick = (node, check) => {
  1056. console.log(node);
  1057. console.log(node.params.code);
  1058. if (node.children && node.children.length > 0) {
  1059. console.log(11);
  1060. } else {
  1061. detailData.table[_index.value].sczl_dedh = node.params.code
  1062. dedhsearchModel.value = false;
  1063. }
  1064. // dedhsearchModel.value = false;
  1065. };
  1066. let flag_Bz = true
  1067. let formElements
  1068. const moveFocus = (event) => {
  1069. // console.log(formElements);
  1070. const index = Array.from(formElements).indexOf(event.target);
  1071. const key = event.key;
  1072. // console.log(detailData);
  1073. const currentInputValue = formElements[index].value;
  1074. event.preventDefault();
  1075. switch (index) {
  1076. case 0:
  1077. if (key === 'ArrowRight' ) {
  1078. formElements[1].focus();
  1079. formElements[1].select();
  1080. } else if (key === 'ArrowLeft') {
  1081. formElements[formElements.length - 1].focus();
  1082. formElements[formElements.length - 1].select();
  1083. } else if (key === 'Enter') {
  1084. formElements[1].focus();
  1085. formElements[1].select();
  1086. }
  1087. break;
  1088. case 1:
  1089. if (key === 'ArrowRight') {
  1090. formElements[3].focus();
  1091. formElements[3].select();
  1092. } else if (key === 'ArrowLeft') {
  1093. formElements[0].focus();
  1094. formElements[0].select();
  1095. } else if (key === 'Enter') {
  1096. handleGetYg();
  1097. }
  1098. break;
  1099. case 3:
  1100. if (key === 'ArrowRight') {
  1101. formElements[4].focus();
  1102. formElements[4].select();
  1103. } else if (key === 'ArrowLeft') {
  1104. formElements[1].focus();
  1105. formElements[1].select();
  1106. } else if (key === 'Enter') {
  1107. formElements[4].focus();
  1108. formElements[4].select();
  1109. }
  1110. break;
  1111. case formElements.length - 1:
  1112. if (key === 'ArrowRight') {
  1113. formElements[0].focus();
  1114. formElements[0].select();
  1115. } else if (key === 'ArrowLeft') {
  1116. formElements[index - 1].focus();
  1117. formElements[index - 1].select();
  1118. } else if (key === 'Enter') {
  1119. formElements[0].focus();
  1120. formElements[0].select();
  1121. }
  1122. break;
  1123. default:
  1124. if (key === 'ArrowRight') {
  1125. formElements[index + 1].focus();
  1126. formElements[index + 1].select();
  1127. } else if (key === 'ArrowLeft') {
  1128. formElements[index - 1].focus();
  1129. formElements[index - 1].select();
  1130. } else if (key === 'Enter') {
  1131. formElements[index + 1].focus();
  1132. formElements[index + 1].select();
  1133. }
  1134. break;
  1135. }
  1136. };
  1137. const movefous2 = (event,row,index)=>{
  1138. const index2 = Array.from(formElements).indexOf(event.target)
  1139. if (row.sczl_dedh != '' & event.key === "ArrowRight"){
  1140. event.stopPropagation();
  1141. formElements[index2+2].focus();
  1142. formElements[index2+2].select();
  1143. }
  1144. }
  1145. const movefous = (event,row,index)=>{
  1146. const index2 = Array.from(formElements).indexOf(event.target)
  1147. if (row.sczl_dedh != '' & event.key === "ArrowLeft"){
  1148. event.stopPropagation();
  1149. formElements[index2-2].focus();
  1150. formElements[index2-2].select();
  1151. }
  1152. }
  1153. </script>
  1154. <style scoped>
  1155. :deep(.plan-usage-low div) {
  1156. color: red !important;
  1157. }
  1158. .JKWTree-container {
  1159. display: flex;
  1160. }
  1161. .JKWTree-tree {
  1162. width: 100%;
  1163. background-color: #fff;
  1164. /*background-color: rgba(241, 224, 224, 0.99);*/
  1165. padding: 10px;
  1166. margin-right: 20px;
  1167. }
  1168. .JKWTree-tree h3 {
  1169. font-size: 15px;
  1170. font-weight: 700;
  1171. margin: 10px 0;
  1172. }
  1173. .JKWTree-content {
  1174. flex: 1;
  1175. }
  1176. :deep(.el-table__body .warning-row) {
  1177. background: #FFFF80 !important;
  1178. }
  1179. /* 选中某行时的背景色 */
  1180. :deep(.el-table__body tr.current-row)>td {
  1181. background: #ff80ff !important;
  1182. }
  1183. :deep(.el-table .bg-yellow) {
  1184. background: yellow;
  1185. }
  1186. </style>
  1187. <style scoped>
  1188. :deep(.el-table td .cell) {
  1189. line-height: 25px !important;
  1190. }
  1191. :deep(.el-tabs__header) {
  1192. margin-bottom: 0;
  1193. }
  1194. .search {
  1195. margin-left: 0px !important;
  1196. margin-right: 10px !important;
  1197. }
  1198. .bt {
  1199. margin-left: 2px !important;
  1200. padding: 3px !important;
  1201. font-size: 12px;
  1202. }
  1203. .el-tabs__header {
  1204. margin: 0px !important;
  1205. }
  1206. .gva-table-box {
  1207. padding: 0px !important;
  1208. }
  1209. .mab {
  1210. margin-bottom: 5px;
  1211. }
  1212. </style>