index.vue 32 KB

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