index.vue 55 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145114611471148114911501151115211531154115511561157115811591160116111621163116411651166116711681169117011711172117311741175117611771178117911801181118211831184118511861187118811891190119111921193119411951196119711981199120012011202120312041205120612071208120912101211121212131214121512161217121812191220122112221223122412251226122712281229123012311232123312341235123612371238123912401241124212431244124512461247124812491250125112521253125412551256125712581259126012611262126312641265126612671268126912701271127212731274127512761277127812791280128112821283128412851286128712881289129012911292129312941295129612971298129913001301130213031304130513061307130813091310131113121313131413151316131713181319132013211322132313241325132613271328132913301331133213331334133513361337133813391340134113421343134413451346134713481349135013511352135313541355135613571358135913601361136213631364136513661367136813691370137113721373137413751376137713781379138013811382138313841385138613871388138913901391139213931394139513961397139813991400140114021403140414051406140714081409141014111412141314141415141614171418141914201421142214231424142514261427142814291430143114321433143414351436143714381439144014411442144314441445144614471448144914501451145214531454145514561457145814591460146114621463146414651466146714681469147014711472147314741475147614771478147914801481148214831484148514861487148814891490149114921493149414951496149714981499150015011502150315041505150615071508150915101511151215131514151515161517151815191520152115221523152415251526152715281529153015311532153315341535153615371538153915401541154215431544154515461547154815491550155115521553155415551556155715581559156015611562156315641565156615671568156915701571157215731574157515761577157815791580158115821583158415851586158715881589159015911592159315941595159615971598159916001601160216031604160516061607160816091610161116121613161416151616161716181619162016211622162316241625162616271628162916301631163216331634163516361637163816391640164116421643164416451646164716481649165016511652165316541655165616571658165916601661166216631664166516661667166816691670167116721673167416751676167716781679168016811682168316841685168616871688168916901691169216931694169516961697169816991700170117021703170417051706170717081709171017111712171317141715171617171718171917201721172217231724172517261727172817291730173117321733173417351736173717381739174017411742174317441745174617471748174917501751175217531754175517561757175817591760176117621763176417651766176717681769177017711772177317741775177617771778177917801781178217831784178517861787178817891790179117921793179417951796179717981799180018011802180318041805180618071808180918101811181218131814181518161817181818191820182118221823182418251826182718281829183018311832183318341835183618371838183918401841184218431844184518461847184818491850
  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%;height: 62vh;" :data="tableData" row-key="ID" highlight-current-row
  26. border show-overflow-tooltip @row-dblclick="handleShowDetail"
  27. :row-style="{ height: '20px' }" :header-cell-style="{ padding: '0px' }"
  28. :cell-style="{ padding: '0px' }" :header-row-style="{ height: '20px' }"
  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. <el-form-item label="日期">
  63. <el-input type="date" max="9999-12-31" @focus="rqHandleFocus()"
  64. v-model="detailData.sczl_rq" style="width: 120px;" @keydown="ent1($event,$index,row,'')" />
  65. </el-form-item>
  66. <el-form-item label="员工编号">
  67. <el-input v-model="detailData.sczl_bh" style="width: 100px;" id="员工编号" @keydown="ent1($event,$index,row,'员工编号')" placeholder="Enter回车" />
  68. <el-input v-model="detailData.name" style="width: 100px; padding-left: 5px;" @click="selectvalue($event)" readonly />
  69. </el-form-item>
  70. <el-form-item label="组别">
  71. <el-input v-model="detailData.sczl_bzdh" style="width: 80px;" @keydown="ent1($event,$index,row,'组别')" />
  72. </el-form-item>
  73. <br>
  74. <el-form-item label="计时时数" style="padding-left: 195px;">
  75. <el-input v-model="detailData.sczl_jsss" style="width: 100px;" @keydown="ent1($event,$index,row,'')"
  76. @click="selectvalue($event)" />
  77. </el-form-item>
  78. <el-form-item label="冲月定额">
  79. <el-input v-model="detailData.sczl_冲定额" style="width: 80px;" @keydown="ent1($event,$index,row,'冲月定额')" />
  80. </el-form-item>
  81. <!-- 表格列表input -->
  82. <el-table :data="detailData.table" border tooltip-effect="dark"
  83. :row-style="{ height: '20px' }" :cell-style="{ padding: '0px' }"
  84. :header-row-style="{ height: '20px' }" :header-cell-style="{ padding: '0px' }">
  85. <el-table-column label="工单编号" width="120">
  86. <template #default="{ row, $index }">
  87. <el-input v-model="row.sczl_gdbh" placeholder="Enter回车"
  88. @keydown="ent1($event,$index,row,'工单编号')"/>
  89. </template>
  90. </el-table-column>
  91. <el-table-column label="印件工序" width="100">
  92. <template #default="{ row }">
  93. <el-input v-model="row.sczl_yjGx" readonly />
  94. </template>
  95. </el-table-column>
  96. <el-table-column label="工序名称" width="100">
  97. <template #default="{ row }">
  98. <el-input v-model="row.sczl_gxmc" readonly />
  99. </template>
  100. </el-table-column>
  101. <el-table-column label="印件名称" width="310">
  102. <template #default="{ row }">
  103. <el-input v-model="row.Gd_cpmc" readonly />
  104. </template>
  105. </el-table-column>
  106. <el-table-column label="核算标准" width="100">
  107. <template #default="{ row }">
  108. <el-input v-model="row.hsbz" @keydown="ent1($event,$index,row,'核算标准')" />
  109. </template>
  110. </el-table-column>
  111. <!-- <el-table-column label="核算标准">
  112. <template #default="{ row }">
  113. <el-select v-model="row.hsbz" @keydown="ent1($event,$index,row,'')" placeholder="请选择" popper-class="dropdown" >
  114. <el-option label="1000" value="1000" ></el-option>
  115. <el-option label="2500" value="2500"></el-option>
  116. </el-select>
  117. </template>
  118. </el-table-column> -->
  119. <el-table-column label="包装产量" width="100">
  120. <template #default="{ row }">
  121. <el-input v-model="row.sczl_cl" @keydown="ent1($event,$index,row,'')" />
  122. </template>
  123. </el-table-column>
  124. <el-table-column label="返工产量" width="95">
  125. <template #default="{ row }">
  126. <el-input v-model="row.sczl_返工产量" @keydown="ent1($event,$index,row,'')" />
  127. </template>
  128. </el-table-column>
  129. <el-table-column label="每箱数量" width="100">
  130. <template #default="{ row }">
  131. <el-input v-model="row.sczl_PgCl" @keydown="ent1($event,$index,row,'')"/>
  132. </template>
  133. </el-table-column>
  134. <el-table-column label="计产系数" width="95">
  135. <template #default="{ row }">
  136. <el-input v-model="row.sczl_计产系数" @keydown="ent1($event,$index,row,'')"/>
  137. </template>
  138. </el-table-column>
  139. <el-table-column label="来源" width="95">
  140. <template #default="{ row }">
  141. <el-input v-model="row.sczl_Jtbh1" @keydown="ent1($event,$index,row,'')"/>
  142. </template>
  143. </el-table-column>
  144. <el-table-column label="定额代号" width="130">
  145. <template #default="{ row, $index }">
  146. <el-input id="input" v-model="row.sczl_dedh"
  147. @keydown="ent1($event,$index,row,'定额代号')" />
  148. </template>
  149. </el-table-column>
  150. </el-table>
  151. <el-form-item label="其他备注" style="margin-top: 10px;">
  152. <el-input v-model="detailData.sczl_desc" @keydown="ent1($event,$index,row,'其他备注')" style="width:600px;"/>
  153. </el-form-item>
  154. </el-form>
  155. <template #footer>
  156. <div class="dialog-footer">
  157. <el-button @click="dialogFormVisible = false">取 消</el-button>
  158. <el-button type="primary" @click="enterDialog">确 定
  159. </el-button>
  160. </div>
  161. </template>
  162. </el-dialog>
  163. <!-- 新增定额代号 -->
  164. <el-dialog v-model="dedhsearchModel" id="tableFplb" @keydown="ent($event)" style="margin-top: 5%;" >
  165. <el-form>
  166. <el-form-item label="选择定额代号" class="mab" prop="keyOrder"></el-form-item>
  167. <div style="border:1px solid #eee; width:100%; height: 600px; overflow-y: auto;">
  168. <el-tree :data="dedhtreeData" ref="table_fplb"
  169. @keydown="handleTreeKeydown"
  170. :props="{ children: 'children',label: 'label'}"
  171. node-key="id" @node-click="dedhhandleNodeClick">
  172. </el-tree>
  173. </div>
  174. </el-form>
  175. </el-dialog>
  176. <!-- 核算标准弹窗 -->
  177. <!-- 核算标准弹窗 -->
  178. <el-dialog v-model="hsbzVisible" title="选择" destroy-on-close width="200px" @keydown="selecthsbz($event)">
  179. <el-table
  180. tooltip-effect="dark"
  181. :data="selectDatahsbz"
  182. row-key="value"
  183. highlight-current-row="true"
  184. border
  185. style="width: 100%"
  186. @row-dblclick="SelectClickhsbz"
  187. ref="tableRef"
  188. >
  189. <el-table-column align="center" prop="value" label="核算标准" width="168" />
  190. </el-table>
  191. </el-dialog>
  192. <!-- 弹出选项框 -->
  193. <el-dialog v-model="dialogSelectVisible" title="选择" destroy-on-close width="800px"
  194. @keydown="selectCP($event)">
  195. <el-table tooltip-effect="dark" :data="selectData" row-key="ID" highlight-current-row border
  196. style="width:100%" @row-dblclick="handleSelectClick" ref="table2">
  197. <el-table-column prop="Gd_cpmc" label="产品名称" width="460" />
  198. <el-table-column prop="Gy0_gxmc" label="工序" width="200" />
  199. <el-table-column prop="jyGx" label="工序编号" width="100" />
  200. </el-table>
  201. </el-dialog>
  202. </div>
  203. <!-- 员工选择 -->
  204. <el-dialog v-model="dialogSelectVisible_Yg" title="选择" destroy-on-close width="300px"
  205. @keydown="selectGX_Yg($event)">
  206. <el-table tooltip-effect="dark" :data="selectData_Yg" row-key="ID" highlight-current-row="true"
  207. border style="width:100%" @row-dblclick="handleSelectClick_Yg" ref="table_Yg">
  208. <el-table-column prop="员工编号" label="员工编号" width="100" />
  209. <el-table-column prop="ygxm" label="员工姓名" width="200" />
  210. </el-table>
  211. </el-dialog>
  212. <!-- 班组选择 -->
  213. <el-dialog v-model="dialogSelectVisible_Bz" title="选择" destroy-on-close width="200px"
  214. @keydown="selectGX_Bz($event)">
  215. <el-table tooltip-effect="dark" :data="selectData_Bz" row-key="ID" highlight-current-row="true"
  216. border style="width:100%" @row-dblclick="handleSelectClick_Bz" ref="table_Bz">
  217. <el-table-column prop="sczl_bzdh" label="班组" width="160" />
  218. </el-table>
  219. </el-dialog>
  220. </el-main>
  221. </el-container>
  222. </el-container>
  223. </div>
  224. </template>
  225. <script>
  226. </script>
  227. <script setup>
  228. import {
  229. Layout,
  230. LayoutContent,
  231. LayoutHeader,
  232. LayoutSider
  233. } from '@arco-design/web-vue'
  234. import {
  235. ElMessage,
  236. ElMessageBox,
  237. dayjs
  238. } from 'element-plus'
  239. // import { Download, Search, Delete } from '@element-plus/icons-vue'
  240. import {
  241. reactive,
  242. ref,
  243. nextTick,
  244. onMounted
  245. } from 'vue'
  246. import {
  247. getGxMc,
  248. getInfo,
  249. getLocate,
  250. getPackingSideTable,
  251. getPackingTable,
  252. updatePackingTable,
  253. getYg,
  254. DeletePackingTable,
  255. addPackingTable,
  256. getDedh
  257. } from '@/api/mes_api_gty/myapi'
  258. import {
  259. useUserStore
  260. } from '@/pinia/modules/user'
  261. const userStore = useUserStore()
  262. const sys_id = '[' + userStore.userInfo.userName + '/' + userStore.userInfo.nickName + ']'
  263. defineOptions({
  264. name: '06PackingDocuments',
  265. })
  266. //班组
  267. const BzVisible = ref (false)
  268. //
  269. const BzVisible2 = ref (false)
  270. const selectDataBz = reactive([])
  271. const selectDataCY = reactive([])
  272. const SelectClickBz = (row, column, event) => {
  273. detailData.sczl_bzdh = row.sczl_bzdh
  274. BzVisible.value = false
  275. }
  276. const selectBZ = (event) => {
  277. if (event.keyCode === 40) { // Enter 或向下箭头
  278. setCurrent(selectDataBz[1]);
  279. } else if (event.keyCode === 38) {
  280. setCurrent(selectDataBz[0]);
  281. } else if (event.keyCode === 13) {
  282. BzVisible.value = false
  283. }
  284. }
  285. const selectCY = (event) => {
  286. if (event.keyCode === 40) { // Enter 或向下箭头
  287. setCurrent2(selectDataCY[1]);
  288. } else if (event.keyCode === 38) {
  289. setCurrent2(selectDataCY[0]);
  290. } else if (event.keyCode === 13) {
  291. BzVisible2.value = false
  292. }
  293. }
  294. const SelectClickCY = (row, column, event) => {
  295. detailData.sczl_冲定额 = row.sczl_冲定额
  296. BzVisible2.value = false
  297. }
  298. // 侧边栏功能
  299. const treeData = reactive([])
  300. const getSideData = async () => {
  301. try {
  302. const response = await getPackingSideTable()
  303. if (response.code === 0) {
  304. const transformedData = response.data.map(item => ({
  305. label: `${item.date.replace(/-/g, '.')}【单据数: ${item.counts}张】`,
  306. children: item.sys.map(sysItem => ({
  307. label: `${sysItem.sys_id} 【记录数: ${sysItem.count}张】`,
  308. params: {
  309. date: item.date.replace(/\./g, '-'),
  310. sys_id: sysItem.sys_id,
  311. },
  312. })),
  313. }))
  314. treeData.splice(0, treeData.length, ...transformedData)
  315. }
  316. } catch (e) {
  317. console.log(e)
  318. }
  319. }
  320. getSideData()
  321. // 表格功能
  322. const tableColumns = [{
  323. label: '员工编号',
  324. prop: 'sczl_bh',
  325. width: '100'
  326. },
  327. {
  328. label: '员工姓名',
  329. prop: 'name',
  330. width: '100'
  331. },
  332. {
  333. label: '生产日期',
  334. prop: 'sczl_rq',
  335. width: '100'
  336. },
  337. {
  338. label: '班组',
  339. prop: 'sczl_bzdh',
  340. width: '100'
  341. },
  342. {
  343. label: '包装产量',
  344. prop: 'sczl_cl',
  345. width: '100'
  346. },
  347. {
  348. label: '返工产量',
  349. prop: 'sczl_fgsl',
  350. width: '100'
  351. },
  352. {
  353. label: '计件产量',
  354. prop: 'sczl_jjcl',
  355. width: '100'
  356. },
  357. {
  358. label: '相关工单',
  359. prop: 'sczl_gdbh1',
  360. width: '100'
  361. },
  362. {
  363. label: '创建用户',
  364. prop: 'sys_id',
  365. width: '120'
  366. },
  367. {
  368. label: '创建时间',
  369. prop: 'sys_rq',
  370. width: '180'
  371. },
  372. {
  373. label: '修改时间',
  374. prop: 'mod_rq',
  375. width: '180'
  376. },
  377. {
  378. label: 'UNIQID',
  379. prop: 'UniqId',
  380. width: '100'
  381. },
  382. ]
  383. const tableData = reactive([])
  384. const params = {
  385. type: '',
  386. date: '',
  387. sys_id: '',
  388. gdbh: '',
  389. }
  390. const total = ref(0)
  391. const page = ref(1)
  392. const limit = ref(50)
  393. const type = ref('')
  394. const searchInfo = ref('')
  395. const currentRow = ref({})
  396. // const multipleSelection = ref([])
  397. // 获取列表数据
  398. const getTableData = async () => {
  399. console.log('刷新列表')
  400. try {
  401. const response = await getPackingTable({
  402. date: params.date,
  403. sys_id: params.sys_id,
  404. page: page.value.toString(),
  405. limit: limit.value.toString(),
  406. })
  407. console.log('查看回调',response)
  408. if (response.code === 0) {
  409. total.value = response.data.total
  410. tableData.splice(0, tableData.length, ...response.data.rows)
  411. setCurrent(tableData[0])
  412. }
  413. } catch (e) {
  414. console.log(e)
  415. }
  416. }
  417. // 获取定位数据
  418. const getLocateTable = async () => {
  419. try {
  420. const response = await getLocate({
  421. gdbh: params.gdbh,
  422. page: page.value.toString(),
  423. limit: limit.value.toString(),
  424. })
  425. if (response.code === 0) {
  426. total.value = response.data.total
  427. tableData.splice(0, tableData.length, ...response.data.rows)
  428. }
  429. } catch (e) {
  430. console.log(e)
  431. }
  432. }
  433. // 删除数据
  434. const deleteTableData = async (id) => {
  435. try {
  436. const res = await DeletePackingTable({
  437. UniqId: id
  438. })
  439. if (res.code === 0) {
  440. return 0
  441. }
  442. } catch (e) {
  443. console.log(e)
  444. }
  445. }
  446. const handleNodeClick = (node, check) => {
  447. if (node.params) {
  448. params.date = node.params.date
  449. params.sys_id = node.params.sys_id
  450. params.type = 'getTableData'
  451. page.value = 1
  452. getTableData()
  453. }
  454. }
  455. const selectvalue = (e) => {
  456. console.log(e)
  457. e.currentTarget.select();
  458. }
  459. // 定位
  460. const handleSearch = () => {
  461. params.gdbh = searchInfo.value
  462. params.type = 'getLocateTable'
  463. page.value = 1
  464. getLocateTable()
  465. }
  466. // 查改
  467. const handleShowDetail = () => {
  468. type.value = '查改'
  469. console.log(currentRow.value)
  470. if (currentRow.value.UniqId == undefined) {
  471. ElMessage({
  472. type: 'warning',
  473. message: '未选中记录',
  474. })
  475. return
  476. } else {
  477. getTableInfo(currentRow.value?.UniqId)
  478. }
  479. }
  480. // 删除
  481. const handleDelete = () => {
  482. if (currentRow.value.UniqId == undefined) {
  483. ElMessage({
  484. type: 'warning',
  485. message: '未选中记录',
  486. })
  487. return
  488. }
  489. ElMessageBox.confirm(
  490. `确认删除这条数据么?`,
  491. '警告', {
  492. confirmButtonText: '确认',
  493. cancelButtonText: '取消',
  494. type: 'warning',
  495. }
  496. )
  497. .then(async () => {
  498. const ret = await deleteTableData(currentRow.value?.UniqId)
  499. if (ret === 0) {
  500. ElMessage({
  501. type: 'success',
  502. message: '删除成功',
  503. })
  504. getSideData()
  505. getTableData()
  506. } else {
  507. ElMessage({
  508. type: 'error',
  509. message: '删除失败',
  510. })
  511. }
  512. })
  513. .catch(() => {
  514. ElMessage({
  515. type: 'info',
  516. message: '取消删除',
  517. })
  518. })
  519. }
  520. // 分页
  521. // #region
  522. const handleSizeChange = () => {
  523. switch (params.type) {
  524. case 'getTableData':
  525. getTableData()
  526. break
  527. case 'getLocateTable':
  528. getLocateTable()
  529. break
  530. default:
  531. break
  532. }
  533. }
  534. const handleCurrentChange = () => {
  535. switch (params.type) {
  536. case 'getTableData':
  537. getTableData()
  538. break
  539. case 'getLocateTable':
  540. getLocateTable()
  541. break
  542. default:
  543. break
  544. }
  545. }
  546. // #endregion
  547. // 详情界面
  548. const detailData = reactive({
  549. UniqId: '',
  550. selectIndex: 0,
  551. sczl_rq: '',
  552. sczl_bh: '',
  553. name: '',
  554. sczl_bzdh: '',
  555. sczl_jsss: '',
  556. sczl_冲定额: '',
  557. sczl_desc: '',
  558. table: [],
  559. })
  560. const selectData = reactive([])
  561. const table = ref()
  562. // 弹窗控制标记
  563. const dialogFormVisible = ref(false)
  564. const dialogSelectVisible = ref(false)
  565. const setCurrent = (row) => {
  566. table.value?.setCurrentRow(row)
  567. detailData.sczl_bzdh = row.sczl_bzdh
  568. detailData.sczl_冲定额 = row.sczl_冲定额
  569. }
  570. const setCurrent2 = (row) => {
  571. table.value?.setCurrentRow(row)
  572. detailData.sczl_冲定额 = row.sczl_冲定额
  573. }
  574. // 获取详细信息
  575. const getTableInfo = async (id) => {
  576. try {
  577. const response = await getInfo({
  578. UniqId: id
  579. })
  580. if (response.code === 0) {
  581. const {
  582. sczl_rq,
  583. sczl_bh,
  584. name,
  585. sczl_bzdh,
  586. sczl_jsss,
  587. sczl_冲定额,
  588. sczl_desc,
  589. ...rest
  590. } = response.data
  591. Object.assign(detailData, {
  592. sczl_rq,
  593. sczl_bh,
  594. name,
  595. sczl_bzdh,
  596. sczl_jsss,
  597. sczl_冲定额,
  598. sczl_desc
  599. })
  600. detailData.table = Array.from({
  601. length: 6
  602. }, (_, i) => i + 1)
  603. .map(num => {
  604. return {
  605. sczl_gdbh: rest[`sczl_gdbh${num}`],
  606. sczl_yjGx: rest[`sczl_yjGx${num}`],
  607. sczl_gxmc: rest[`sczl_gxmc${num}`],
  608. Gd_cpmc: rest[`Gd_cpmc${num}`],
  609. sczl_cl: rest[`sczl_cl${num}`],
  610. hsbz:rest[`sczl_type${num}`],
  611. sczl_返工产量: rest[`sczl_返工产量${num}`],
  612. sczl_PgCl: rest[`sczl_PgCl${num}`],
  613. sczl_计产系数: rest[`sczl_计产系数${num}`],
  614. sczl_Jtbh1: rest[`sczl_Jtbh${num}`],
  615. sczl_dedh: rest[`sczl_dedh${num}`],
  616. }
  617. })
  618. if (type.value === '新增') {
  619. console.log(detailData)
  620. // detailData.name = ''
  621. // detailData.sczl_bh = ''
  622. // detailData.sczl_bzdh = ''
  623. // detailData.sczl_desc = ''
  624. // detailData.sczl_jsss = ''
  625. // detailData.sczl_rq = ''
  626. detailData.table.forEach(row => {
  627. for (const key in row) {
  628. if ( key === 'sczl_cl'){
  629. row[key] = '' // 清空每行的内容
  630. }
  631. }
  632. })
  633. } else {
  634. detailData.UniqId = id
  635. dialogFormVisible.value = true
  636. }
  637. if (type.value === '新增' || type.value === '查改') {
  638. detailData.UniqId = id
  639. dialogFormVisible.value = true
  640. // 在 setTimeout 中获取元素,确保在 DOM 渲染完毕后执行
  641. setTimeout(() => {
  642. formElements = document.getElementById('detail-form').elements
  643. formElements[0].focus()
  644. }, 0)
  645. }
  646. }
  647. } catch (e) {
  648. console.log(e)
  649. }
  650. }
  651. //日期获得焦点事件
  652. const rqHandleFocus = () => {
  653. if (detailData.sczl_rq == '') {
  654. detailData.sczl_rq = new Date().toISOString().split('T')[0]
  655. }
  656. }
  657. // 获取工序名称
  658. const getTableGxMc = async (event,index, row) => {
  659. try {
  660. const response = await getGxMc({
  661. gdbh: row.sczl_gdbh
  662. })
  663. if (response.code === 0) {
  664. if (response.data.length === 0) {
  665. ElMessage({
  666. type: 'error',
  667. message: row.sczl_gdbh+'工单未发现印件、工艺数据,请先维护工单基础数据',
  668. })
  669. detailData.table[index].Gd_cpmc = ''
  670. detailData.table[index].sczl_yjGx = ''
  671. detailData.table[index].sczl_gxmc = ''
  672. }else if (response.data.length === 1) {
  673. const {
  674. Gd_cpmc,
  675. Gy0_gxmc,
  676. jyGx
  677. } = response.data[0]
  678. detailData.table[index].Gd_cpmc = Gd_cpmc
  679. detailData.table[index].sczl_yjGx = jyGx
  680. detailData.table[index].sczl_gxmc = Gy0_gxmc
  681. } else {
  682. selectData.splice(0, selectData.length, ...response.data)
  683. setCPCurrent(selectData[0])
  684. detailData.selectIndex = index
  685. dialogSelectVisible.value = true
  686. }
  687. }
  688. } catch (e) {
  689. console.log(e)
  690. }
  691. }
  692. // 更新数据
  693. const updateDetailData = async () => {
  694. const restoredData = {
  695. UniqId: detailData.UniqId,
  696. sczl_rq: detailData.sczl_rq,
  697. sczl_bh: detailData.sczl_bh,
  698. name: detailData.name,
  699. sczl_bzdh: detailData.sczl_bzdh,
  700. sczl_jsss: detailData.sczl_jsss,
  701. sczl_冲定额: detailData.sczl_冲定额,
  702. sczl_desc: detailData.sczl_desc,
  703. }
  704. detailData.table.forEach((item, index, array) => {
  705. const num = index + 1
  706. restoredData[`sczl_gdbh${num}`] = item.sczl_gdbh
  707. restoredData[`sczl_yjGx${num}`] = item.sczl_yjGx
  708. restoredData[`sczl_gxmc${num}`] = item.sczl_gxmc
  709. restoredData[`sczl_type${num}`] = item.hsbz === undefined ? '' : item.hsbz;
  710. restoredData[`Gd_cpmc${num}`] = item.Gd_cpmc
  711. restoredData[`sczl_cl${num}`] = item.sczl_cl
  712. restoredData[`sczl_返工产量${num}`] = item.sczl_返工产量
  713. restoredData[`sczl_PgCl${num}`] = item.sczl_PgCl
  714. restoredData[`sczl_计产系数${num}`] = item.sczl_计产系数
  715. restoredData[`sczl_Jtbh${num}`] = item.sczl_Jtbh1
  716. restoredData[`sczl_dedh${num}`] = item.sczl_dedh
  717. })
  718. console.log(restoredData)
  719. // return false;
  720. const res = await updatePackingTable(restoredData)
  721. if (res.code === 0) {
  722. ElMessage({
  723. type: 'success',
  724. message: '更新成功',
  725. })
  726. getTableData()
  727. dialogFormVisible.value = false
  728. }
  729. setTimeout(() => {
  730. const inputElement = document.getElementById('员工编号');
  731. if (inputElement) {
  732. inputElement.focus();
  733. }
  734. }, 100);
  735. }
  736. // 新增数据
  737. const handleShowAdd = async () => {
  738. type.value = '新增'
  739. if (currentRow.value.UniqId == null) {
  740. detailData.table = Array.from({
  741. length: 6
  742. }, (_, i) => i + 1)
  743. .map(num => {
  744. return {
  745. sczl_gdbh: '',
  746. sczl_yjGx: '',
  747. sczl_gxmc: '',
  748. Gd_cpmc: '',
  749. sczl_cl: '',
  750. sczl_返工产量: '',
  751. sczl_PgCl: '',
  752. sczl_计产系数: '',
  753. sczl_Jtbh1: '',
  754. sczl_dedh: '',
  755. }
  756. })
  757. // setTimeout(() => {
  758. // formElements = document.getElementById('detail-form').elements
  759. // formElements[0].focus()
  760. // }, 0)
  761. dialogFormVisible.value = true
  762. } else {
  763. await getTableInfo(currentRow.value?.UniqId)
  764. // 默认日期为前一天的日期
  765. const date = dayjs().subtract(1, 'day').format('YYYY-MM-DD')
  766. detailData.sczl_rq = date
  767. }
  768. }
  769. const addDetailData = async () => {
  770. const restoredData = {
  771. sys_id: sys_id,
  772. sczl_rq: detailData.sczl_rq,
  773. sczl_bh: detailData.sczl_bh,
  774. // name: detailData.name,
  775. sczl_bzdh: detailData.sczl_bzdh,
  776. sczl_jsss: detailData.sczl_jsss,
  777. sczl_冲定额: detailData.sczl_冲定额,
  778. sczl_desc: detailData.sczl_desc,
  779. }
  780. detailData.table.forEach((item, index, array) => {
  781. const num = index + 1
  782. restoredData[`sczl_gdbh${num}`] = item.sczl_gdbh
  783. restoredData[`sczl_yjGx${num}`] = item.sczl_yjGx
  784. restoredData[`sczl_gxmc${num}`] = item.sczl_gxmc
  785. restoredData[`sczl_type${num}`] = item.hsbz === undefined ? '' : item.hsbz;
  786. // restoredData[`Gd_cpmc${num}`] = item.Gd_cpmc
  787. restoredData[`sczl_cl${num}`] = item.sczl_cl
  788. restoredData[`sczl_返工产量${num}`] = item.sczl_返工产量
  789. restoredData[`sczl_PgCl${num}`] = item.sczl_PgCl
  790. restoredData[`sczl_计产系数${num}`] = item.sczl_计产系数
  791. restoredData[`sczl_Jtbh${num}`] = item.sczl_Jtbh1
  792. restoredData[`sczl_dedh${num}`] = item.sczl_dedh
  793. })
  794. const res = await addPackingTable(restoredData)
  795. if (res.code === 0) {
  796. ElMessage({
  797. type: 'success',
  798. message: '新增成功',
  799. })
  800. getTableData()
  801. if (params.date != '') {
  802. getTableData()
  803. }
  804. getSideData()
  805. }
  806. setTimeout(() => {
  807. const inputElement = document.getElementById('员工编号');
  808. if (inputElement) {
  809. inputElement.focus();
  810. }
  811. }, 100);
  812. }
  813. //弹出框回车事件
  814. const handleGetYg = async () => {
  815. if (detailData.sczl_bh == '') {
  816. formElements = document.getElementById('detail-form').elements
  817. formElements[3].focus()
  818. formElements[3].select()
  819. return
  820. }
  821. try {
  822. const response = await getYg({ sczl_bh: detailData.sczl_bh })
  823. if (response.code == 0) {
  824. if (response.data.length == 1) {
  825. detailData.name = response.data[0].ygxm
  826. detailData.sczl_bh = response.data[0].员工编号
  827. detailData.sczl_jsss = "0"
  828. // detailData.sczl_冲定额 = "0"
  829. formElements = document.getElementById('detail-form').elements
  830. formElements[3].focus()
  831. formElements[3].select()
  832. } else if (response.data.length > 1) {
  833. selectData_Yg.splice(0, selectData_Yg.length, ...response.data)
  834. setGXCurrent_Yg(selectData_Yg[0])
  835. dialogSelectVisible_Yg.value = true
  836. } else {
  837. ElMessage({
  838. type: 'warning',
  839. message: '未查询到该员工'
  840. })
  841. detailData.name = ''
  842. detailData.sczl_bh = ''
  843. }
  844. } else {
  845. detailData.name = '';
  846. detailData.sczl_bh = '';
  847. }
  848. } catch (e) {
  849. console.log(e)
  850. }
  851. }
  852. const dialogSelectVisible_Yg = ref(false)
  853. const selectData_Yg = reactive([])
  854. // 处理选择框
  855. const handleSelectClick_Yg = (row, column, event) => {
  856. detailData.name = row.ygxm
  857. detailData.sczl_bh = row.员工编号
  858. dialogSelectVisible_Yg.value = false
  859. formElements = document.getElementById('detail-form').elements
  860. formElements[3].focus()
  861. formElements[3].select()
  862. }
  863. const currentIndex_Yg = ref(0);
  864. const GXCurrent_Yg = ref(0);
  865. const selectGX_Yg = (event) => {
  866. if (event.keyCode === 40) { // 向下箭头
  867. if (currentIndex_Yg.value < selectData_Yg.length - 1) {
  868. currentIndex_Yg.value++;
  869. setGXCurrent_Yg(selectData_Yg[currentIndex_Yg.value]);
  870. } else {
  871. currentIndex_Yg.value = 0;
  872. setGXCurrent_Yg(selectData_Yg[currentIndex_Yg.value]); // 到达最后一行时回到第一行
  873. }
  874. } else if (event.keyCode === 38) { // 向上箭头
  875. if (currentIndex_Yg.value > 0) {
  876. currentIndex_Yg.value--;
  877. setGXCurrent_Yg(selectData_Yg[currentIndex_Yg.value]);
  878. } else {
  879. currentIndex_Yg.value = selectData_Yg.length - 1;
  880. setGXCurrent_Yg(selectData_Yg[currentIndex_Yg.value]); // 到达第一行时回到最后一行
  881. }
  882. } else if (event.keyCode === 13) { // 回车键
  883. dialogSelectVisible_Yg.value = false;
  884. formElements = document.getElementById('detail-form').elements
  885. formElements[3].focus()
  886. formElements[3].select()
  887. }
  888. }
  889. const table_Yg = ref()
  890. const setGXCurrent_Yg = (row) => {
  891. setTimeout(() => {
  892. table_Yg.value?.setCurrentRow(row)
  893. detailData.name = row.ygxm
  894. detailData.sczl_bh = row.员工编号
  895. })
  896. }
  897. //班组回车事件
  898. // const getBzsubmit = (event) => {
  899. // if (event.keyCode !== 37){
  900. // //弹出选择
  901. // const data = [{
  902. // 'sczl_bzdh': 'A班'
  903. // }, {
  904. // 'sczl_bzdh': 'B班'
  905. // }]
  906. // selectDataBz.splice(0, selectDataBz.length, ...data)
  907. // if (dialogSelectVisible_Yg.value == false){
  908. // BzVisible.value = true
  909. // }
  910. // setCurrent(data[0])
  911. // }
  912. // }
  913. // //冲月定额
  914. // const getBzsubmit2 = (event) => {
  915. // if (event.keyCode !== 37) {
  916. // const data = [{
  917. // 'sczl_冲定额': '是'
  918. // }, {
  919. // 'sczl_冲定额': '否'
  920. // }]
  921. // selectDataCY.splice(0, selectDataCY.length, ...data)
  922. // BzVisible2.value = true
  923. // setCurrent2(data[0])
  924. // }
  925. // }
  926. const dialogSelectVisible_Bz = ref(false)
  927. const selectData_Bz = reactive([])
  928. // 处理选择框
  929. const handleSelectClick_Bz = (row, column, event) => {
  930. detailData.sczl_bzdh = row.sczl_bzdh
  931. dialogSelectVisible_Bz.value = false
  932. }
  933. const currentIndex_Bz = ref(0);
  934. const GXCurrent_Bz = ref(0);
  935. const selectGX_Bz = (event) => {
  936. if (event.keyCode === 40) { // 向下箭头
  937. if (currentIndex_Bz.value < selectData_Bz.length - 1) {
  938. currentIndex_Bz.value++;
  939. setGXCurrent_Bz(selectData_Bz[currentIndex_Bz.value]);
  940. } else {
  941. currentIndex_Bz.value = 0;
  942. setGXCurrent_Bz(selectData_Bz[currentIndex_Bz.value]); // 到达最后一行时回到第一行
  943. }
  944. } else if (event.keyCode === 38) { // 向上箭头
  945. if (currentIndex_Bz.value > 0) {
  946. currentIndex_Bz.value--;
  947. setGXCurrent_Bz(selectData_Bz[currentIndex_Bz.value]);
  948. } else {
  949. currentIndex_Bz.value = selectData_Bz.length - 1;
  950. setGXCurrent_Bz(selectData_Bz[currentIndex_Bz.value]); // 到达第一行时回到最后一行
  951. }
  952. } else if (event.keyCode === 13) { // 回车键
  953. dialogSelectVisible_Bz.value = false;
  954. }
  955. }
  956. const table_Bz = ref()
  957. const setGXCurrent_Bz = (row) => {
  958. setTimeout(() => {
  959. table_Bz.value?.setCurrentRow(row)
  960. detailData.sczl_bzdh = row.sczl_bzdh
  961. })
  962. }
  963. // 处理选择框回车操作
  964. // const handleEnter = (event,index, row) => {
  965. // const inputs = document.getElementsByTagName("input");
  966. // const currentIndex = Array.from(inputs).indexOf(event.target);
  967. // // console.log(inputs)
  968. // if(event.keyCode === 13){
  969. // console.log("回车")
  970. // detailData.table[index].sczl_dedh = '030002002'
  971. // detailData.table[index].sczl_计产系数 = '1.000'
  972. // if (row.sczl_gdbh === '') {
  973. // detailData.table[index].sczl_yjGx = ''
  974. // detailData.table[index].sczl_gxmc = ''
  975. // detailData.table[index].Gd_cpmc = ''
  976. // } else {
  977. // getTableGxMc(index, row)
  978. // }
  979. // }
  980. // }
  981. // 处理选择框
  982. const handleSelectClick = (row, column, event) => {
  983. const {
  984. Gd_cpmc,
  985. Gy0_gxmc,
  986. jyGx
  987. } = row
  988. const index = detailData.selectIndex
  989. detailData.table[index].Gd_cpmc = Gd_cpmc
  990. detailData.table[index].sczl_yjGx = jyGx
  991. detailData.table[index].sczl_gxmc = Gy0_gxmc
  992. dialogSelectVisible.value = false
  993. }
  994. const table2 = ref()
  995. const setCPCurrent = (row) => {
  996. setTimeout(() => {
  997. table2.value?.setCurrentRow(row)
  998. const {
  999. Gd_cpmc,
  1000. Gy0_gxmc,
  1001. jyGx
  1002. } = row
  1003. const index = detailData.selectIndex
  1004. detailData.table[index].Gd_cpmc = Gd_cpmc
  1005. detailData.table[index].sczl_yjGx = jyGx
  1006. detailData.table[index].sczl_gxmc = Gy0_gxmc
  1007. })
  1008. }
  1009. const CPIndex = ref(0);
  1010. const JYCurrent = ref(0);
  1011. const selectCP = (event) => {
  1012. if (event.keyCode === 40) { // 向下箭头
  1013. if (CPIndex.value < selectData.length - 1) {
  1014. CPIndex.value++;
  1015. setCPCurrent(selectData[CPIndex.value]);
  1016. } else {
  1017. CPIndex.value = 0;
  1018. setCPCurrent(selectData[CPIndex.value]); // 到达最后一行时回到第一行
  1019. }
  1020. } else if (event.keyCode === 38) { // 向上箭头
  1021. if (CPIndex.value > 0) {
  1022. CPIndex.value--;
  1023. setCPCurrent(selectData[CPIndex.value]);
  1024. } else {
  1025. CPIndex.value = selectData.length - 1;
  1026. setCPCurrent(selectData[CPIndex.value]); // 到达第一行时回到最后一行
  1027. }
  1028. } else if (event.keyCode === 13) { // 回车键
  1029. dialogSelectVisible.value = false
  1030. }
  1031. }
  1032. // 弹窗确定
  1033. const enterDialog = async () => {
  1034. for(let i = 0; i < detailData.table.length; i++) {
  1035. if (detailData.table[i].sczl_gdbh ) {
  1036. if(detailData.table[i].sczl_yjGx === '' || detailData.table[i].sczl_gxmc === '' || detailData.table[i].Gd_cpmc === ''){
  1037. ElMessage({
  1038. type: 'warning',
  1039. message: detailData.table[i].sczl_gdbh + '工单未填写印件工序、工序名称或印件名称,无法保存'
  1040. })
  1041. return;
  1042. }
  1043. }
  1044. }
  1045. ElMessageBox.confirm('数据存盘?', '提示', {
  1046. confirmButtonText: '确定',
  1047. cancelButtonText: '取消',
  1048. type: 'warning'
  1049. }).then(() => {
  1050. console.log(detailData.table[0].sczl_gdbh)
  1051. if (type.value === '查改') {
  1052. updateDetailData()
  1053. console.log('查改')
  1054. } else if (type.value === '新增') {
  1055. addDetailData()
  1056. }
  1057. })
  1058. }
  1059. /*
  1060. 定额代号
  1061. */
  1062. const dedhtreeData = reactive([]);
  1063. const treeRef = ref(null);
  1064. const dedhsearchModel = ref(false);
  1065. const table_fplb = ref(null); // el-tree 的 ref
  1066. const defaultExpandedKey = ref(null); // 默认展开的节点 key
  1067. const selectIndex = ref(0); // 当前选中的索引
  1068. const _index = ref(null)
  1069. const getDedhsubmit = async (event,index, row) => {
  1070. try {
  1071. // 如果当前值是特殊值,直接跳到下一行
  1072. if (detailData.table[index].sczl_dedh === "030002002") {
  1073. jumpToNextRow(index);
  1074. return;
  1075. }
  1076. // 请求数据
  1077. const response = await getDedh();
  1078. if (response.code === 0) {
  1079. const treeData = response.data;
  1080. // 判断当前行的值是否存在于返回数据中
  1081. const isValueExist = checkIfValueExist(treeData, row.sczl_dedh);
  1082. if (isValueExist) {
  1083. console.log("匹配成功,跳转到下一行");
  1084. jumpToNextRow(index); // 跳转到下一行
  1085. } else {
  1086. if (event.keyCode === 13) {
  1087. // 如果不匹配,弹出弹窗
  1088. dedhsearchModel.value = true;
  1089. _index.value = index; // 保存当前行索引
  1090. // 构建树形数据
  1091. dedhtreeData.splice(0, dedhtreeData.length, ...treeData.map((node) => buildTree(node)));
  1092. nextTick(() => {
  1093. const tree = table_fplb.value;
  1094. if (tree) {
  1095. const firstNode = tree.getNode(0);
  1096. if (firstNode) {
  1097. firstNode.expanded = true;
  1098. firstNode.el.scrollIntoView();
  1099. firstNode.el.focus();
  1100. }
  1101. }
  1102. });
  1103. }
  1104. }
  1105. }
  1106. } catch (error) {
  1107. console.error("获取数据出错:", error);
  1108. }
  1109. };
  1110. // 判断当前值是否存在于树数据中
  1111. const checkIfValueExist = (data, targetValue) => {
  1112. let found = false;
  1113. const search = (nodes) => {
  1114. for (const node of nodes) {
  1115. if (node.sys_bh === targetValue) {
  1116. found = true;
  1117. break;
  1118. }
  1119. if (Array.isArray(node.bh_mc)) {
  1120. search(node.bh_mc); // 递归搜索
  1121. }
  1122. }
  1123. };
  1124. search(data);
  1125. return found;
  1126. };
  1127. // 构建树形数据
  1128. const buildTree = (node, parentIndex = "") => {
  1129. return {
  1130. id: parentIndex ? `${parentIndex}-${node.sys_bh}` : node.sys_bh,
  1131. label: `${node.sys_mc}【${node.sys_bh}】`,
  1132. params: { code: node.sys_bh },
  1133. children: Array.isArray(node.bh_mc)
  1134. ? node.bh_mc.map((child) => buildTree(child, node.sys_bh))
  1135. : [],
  1136. };
  1137. };
  1138. // 跳转到下一行的工单编号
  1139. const jumpToNextRow = (currentIndex) => {
  1140. const nextRowIndex = currentIndex + 1;
  1141. if (nextRowIndex < detailData.table.length) {
  1142. nextTick(() => {
  1143. const nextInput = document.querySelector(
  1144. `[data-index="${nextRowIndex}"] input`
  1145. );
  1146. if (nextInput) {
  1147. nextInput.focus(); // 聚焦到下一行的工单编号输入框
  1148. }
  1149. });
  1150. }
  1151. };
  1152. //键盘事件
  1153. const handleTreeKeydown = (event, index) => {
  1154. // _index.value = index; // 保存当前行索引
  1155. const tree = table_fplb.value; // 获取树实例
  1156. if (!tree) {
  1157. console.error("树组件未加载");
  1158. return;
  1159. }
  1160. const focusedElement = document.activeElement;
  1161. const focusedNodeId = focusedElement?.getAttribute("data-key");
  1162. // 回车键(13)的处理
  1163. if (event.keyCode === 13 && focusedNodeId) {
  1164. tree.setCurrentKey(focusedNodeId);
  1165. tree.$nextTick(() => {
  1166. const currentNode = tree.getCurrentNode();
  1167. if (!currentNode) {
  1168. console.warn("没有选中的节点");
  1169. return;
  1170. }
  1171. // 清除上一次的选中状态
  1172. clearPreviousSelection(tree);
  1173. // 收起所有其他节点
  1174. Object.keys(tree.store.nodesMap).forEach((key) => {
  1175. tree.store.nodesMap[key].expanded = false; // 收起所有节点
  1176. });
  1177. // 展开当前节点
  1178. tree.store.nodesMap[currentNode.id].expanded = true;
  1179. // 如果当前节点有子节点,选中第一个子节点
  1180. if (currentNode.children && currentNode.children.length > 0) {
  1181. const firstChild = currentNode.children[0];
  1182. if (firstChild) {
  1183. const firstChildKey = firstChild.id.toString();
  1184. tree.setCurrentKey(firstChildKey);
  1185. setTimeout(() => {
  1186. const firstChildDom = tree.$el.querySelector(`[data-key="${firstChildKey}"]`);
  1187. if (firstChildDom) {
  1188. firstChildDom.focus();
  1189. firstChildDom.scrollIntoView({ block: "nearest" });
  1190. }
  1191. });
  1192. }
  1193. } else {
  1194. // 当前节点没有子节点的逻辑
  1195. console.log("当前行索引:", _index.value); // 打印当前行索引
  1196. console.log("当前子节点:", currentNode.label);
  1197. const currentLabel = currentNode.label;
  1198. const code = currentLabel.split("【")[1]?.split("】")[0] || "";
  1199. // 赋值给当前行的字段
  1200. detailData.table[_index.value].sczl_dedh = code;
  1201. dedhsearchModel.value = false; // 关闭弹窗
  1202. }
  1203. });
  1204. }
  1205. // 上下箭头键(38/40)的处理
  1206. else if (event.keyCode === 38 || event.keyCode === 40) {
  1207. const currentNode = tree.getCurrentNode();
  1208. if (currentNode) {
  1209. const currentNodeDom = tree.$el.querySelector(`[data-key="${currentNode.id}"]`);
  1210. if (currentNodeDom) {
  1211. currentNodeDom.focus();
  1212. }
  1213. }
  1214. }
  1215. };
  1216. // 清除之前的选中状态
  1217. const clearPreviousSelection = (tree) => {
  1218. const selectedNodes = tree.getCheckedNodes();
  1219. selectedNodes.forEach(node => {
  1220. tree.setChecked(node, false);
  1221. });
  1222. tree.setCurrentKey(null);
  1223. };
  1224. // 弹出框键盘事件
  1225. const ent = (event) => {
  1226. if (document.activeElement.id === "tableFplb") {
  1227. if (table_fplb.value) {
  1228. const tree = table_fplb.value?.$el;
  1229. console.log(111, tree);
  1230. if (tree) {
  1231. const node = tree.querySelector("[data-key]");
  1232. console.log(222, node);
  1233. if (event.keyCode === 13) {
  1234. /* 跳过 */
  1235. }
  1236. if (node) {
  1237. node.scrollIntoView({ block: "nearest" }); // 确保节点可见
  1238. node.focus(); // 确保焦点正确
  1239. }
  1240. }
  1241. }
  1242. }
  1243. };
  1244. // 点击定额代号
  1245. const dedhhandleNodeClick = (node, check) => {
  1246. console.log(node);
  1247. console.log(node.params.code);
  1248. if (node.children && node.children.length > 0) {
  1249. console.log(11);
  1250. } else {
  1251. detailData.table[_index.value].sczl_dedh = node.params.code
  1252. dedhsearchModel.value = false;
  1253. }
  1254. // dedhsearchModel.value = false;
  1255. };
  1256. let flag_Bz = true
  1257. let formElements
  1258. // const moveFocus = (event,index,row,title) => {
  1259. // // console.log(formElements);
  1260. // const index = Array.from(formElements).indexOf(event.target);
  1261. // const key = event.key;
  1262. // console.log(index);
  1263. // const currentInputValue = formElements[index].value;
  1264. // event.preventDefault();
  1265. // switch (index) {
  1266. // case 0:
  1267. // if (key === 'ArrowRight' ) {
  1268. // formElements[1].focus();
  1269. // formElements[1].select();
  1270. // } else if (key === 'ArrowLeft') {
  1271. // formElements[formElements.length - 1].focus();
  1272. // formElements[formElements.length - 1].select();
  1273. // } else if (key === 'Enter') {
  1274. // formElements[1].focus();
  1275. // formElements[1].select();
  1276. // }
  1277. // break;
  1278. // case 1:
  1279. // if (key === 'ArrowRight') {
  1280. // formElements[3].focus();
  1281. // formElements[3].select();
  1282. // } else if (key === 'ArrowLeft') {
  1283. // formElements[0].focus();
  1284. // formElements[0].select();
  1285. // } else if (key === 'Enter') {
  1286. // handleGetYg();
  1287. // }
  1288. // break;
  1289. // case 3:
  1290. // if (key === 'ArrowRight') {
  1291. // formElements[4].focus();
  1292. // formElements[4].select();
  1293. // } else if (key === 'ArrowLeft') {
  1294. // formElements[1].focus();
  1295. // formElements[1].select();
  1296. // } else if (key === 'Enter') {
  1297. // formElements[4].focus();
  1298. // formElements[4].select();
  1299. // }
  1300. // break;
  1301. // case formElements.length - 1:
  1302. // if (key === 'ArrowRight') {
  1303. // formElements[0].focus();
  1304. // formElements[0].select();
  1305. // } else if (key === 'ArrowLeft') {
  1306. // formElements[index - 1].focus();
  1307. // formElements[index - 1].select();
  1308. // } else if (key === 'Enter') {
  1309. // formElements[0].focus();
  1310. // formElements[0].select();
  1311. // enterDialog()
  1312. // }
  1313. // break;
  1314. // default:
  1315. // if (key === 'ArrowRight') {
  1316. // formElements[index + 1].focus();
  1317. // formElements[index + 1].select();
  1318. // } else if (key === 'ArrowLeft') {
  1319. // formElements[index - 1].focus();
  1320. // formElements[index - 1].select();
  1321. // } else if (key === 'Enter') {
  1322. // formElements[index + 1].focus();
  1323. // formElements[index + 1].select();
  1324. // }
  1325. // break;
  1326. // }
  1327. // };
  1328. // const movefous2 = (event,row,index)=>{
  1329. // const index2 = Array.from(formElements).indexOf(event.target)
  1330. // if (row.sczl_dedh != '' & event.key === "ArrowRight"){
  1331. // event.stopPropagation();
  1332. // formElements[index2+2].focus();
  1333. // formElements[index2+2].select();
  1334. // }
  1335. // }
  1336. // const movefous = (event,row,index)=>{
  1337. // console.log(1)
  1338. // const index2 = Array.from(formElements).indexOf(event.target)
  1339. // if (row.sczl_dedh != '' & event.key === "ArrowLeft"){
  1340. // event.stopPropagation();
  1341. // formElements[index2-2].focus();
  1342. // formElements[index2-2].select();
  1343. // }
  1344. // if(row.sczl_gdbh === '' && event.key === "Enter" ){
  1345. // event.stopPropagation();
  1346. // formElements[index2+11].focus();
  1347. // formElements[index2+11].select();
  1348. // row.sczl_yjGx = ""
  1349. // row.sczl_gxmc = ""
  1350. // row.Gd_cpmc = ""
  1351. // row.hsbz = ""
  1352. // row.sczl_cl = ""
  1353. // row.sczl_返工产量 = ""
  1354. // row.sczl_计产系数 = ""
  1355. // row.sczl_PgCl = ""
  1356. // row.sczl_Jtbh1 = ""
  1357. // row.sczl_dedh = ""
  1358. // }
  1359. // }
  1360. // const moveFocus3 = (event, index, formElements) => {
  1361. // const key = event.key; // 获取当前按下的键
  1362. // console.log("当前按下的键:", key);
  1363. // if (key === 'ArrowRight') {
  1364. // // 右方向键:将焦点移到下一个元素
  1365. // if (index + 1 < formElements.length) {
  1366. // formElements[index + 1].focus();
  1367. // formElements[index + 1].select();
  1368. // }
  1369. // } else if (key === 'ArrowLeft') {
  1370. // // 左方向键:将焦点移到上一个元素
  1371. // if (index - 1 >= 0) {
  1372. // formElements[index - 1].focus();
  1373. // formElements[index - 1].select();
  1374. // }
  1375. // } else if (key === 'Enter') {
  1376. // event.stopPropagation();
  1377. // formElements[index2-2].focus();
  1378. // formElements[index2-2].select();
  1379. // }
  1380. // };
  1381. /*
  1382. 核算标准
  1383. */
  1384. const hsbzVisible = ref(false); // 控制弹窗显示
  1385. const selectDatahsbz = ref([{ value: "1000" }, { value: "2500" }]); // 弹窗数据
  1386. const currentRowIndex = ref(0); // 弹窗中当前高亮的行索引
  1387. const tableRef = ref(null); // 弹窗表格的引用
  1388. const editingRow = ref(null); // 当前主表格中正在编辑的行
  1389. // 弹窗键盘事件处理
  1390. const selecthsbz = (event) => {
  1391. const maxIndex = selectDatahsbz.value.length - 1;
  1392. if (event.key === "ArrowUp") {
  1393. currentRowIndex.value = currentRowIndex.value === 0 ? maxIndex : currentRowIndex.value - 1;
  1394. updateHighlightRow();
  1395. } else if (event.key === "ArrowDown") {
  1396. currentRowIndex.value = currentRowIndex.value === maxIndex ? 0 : currentRowIndex.value + 1;
  1397. updateHighlightRow();
  1398. } else if (event.key === "Enter") {
  1399. const selectedRow = selectDatahsbz.value[currentRowIndex.value];
  1400. if (selectedRow) {
  1401. SelectClickhsbz(selectedRow);
  1402. }
  1403. }
  1404. };
  1405. // 更新弹窗中高亮行
  1406. const updateHighlightRow = () => {
  1407. nextTick(() => {
  1408. if (tableRef.value) {
  1409. tableRef.value.setCurrentRow(selectDatahsbz.value[currentRowIndex.value]);
  1410. }
  1411. });
  1412. };
  1413. // 选中某一行,并将数据回填到主表格
  1414. const SelectClickhsbz = (selectedRow) => {
  1415. if (!selectedRow) return;
  1416. console.log("selectedRow.value", selectedRow.value);
  1417. // 将选中的值回填到主表格当前行的 `hsbz` 字段
  1418. if (editingRow.value) {
  1419. editingRow.value.hsbz = selectedRow.value; // 确保 editingRow 是响应式的
  1420. } else {
  1421. console.error("当前没有编辑的行!");
  1422. }
  1423. // 关闭弹窗
  1424. hsbzVisible.value = false;
  1425. };
  1426. //回车事件
  1427. const ent1 = (event,index,row,title) => {
  1428. const inputs = document.getElementsByTagName("input");
  1429. const currentIndex = Array.from(inputs).indexOf(event.target);
  1430. if (event.keyCode === 13 && title === '工单编号') { // 检测是否按下回车键,且当前列为工单编号
  1431. if (row["sczl_gdbh"] === "") { // 如果当前工单编号为空
  1432. event.preventDefault(); // 阻止默认事件
  1433. event.stopPropagation(); // 阻止事件冒泡
  1434. // 跳转到下一行的工单编号输入框
  1435. const nextInputIndex = currentIndex + 11; // 假设每行有 10 个 input
  1436. if (nextInputIndex < inputs.length) { // 如果下一行的 input 存在
  1437. inputs[nextInputIndex].focus(); // 聚焦到下一行的工单编号
  1438. inputs[nextInputIndex].select(); // 选中内容
  1439. }
  1440. // 清空当前行的相关字段
  1441. row.sczl_yjGx = "";
  1442. row.sczl_gxmc = "";
  1443. row.Gd_cpmc = "";
  1444. row.hsbz = "";
  1445. row.sczl_cl = "";
  1446. row.sczl_返工产量 = "";
  1447. row.sczl_计产系数 = "";
  1448. row.sczl_PgCl = "";
  1449. row.sczl_Jtbh1 = "";
  1450. row.sczl_dedh = "";
  1451. // 设置当前行默认值
  1452. // detailData.table[index].sczl_dedh = "030002002"; // 设置默认 dedh 值
  1453. // detailData.table[index].sczl_计产系数 = "1.000"; // 设置默认 计产系数 值
  1454. detailData.table[index].sczl_dedh = ""; // 设置默认 dedh 值
  1455. detailData.table[index].sczl_计产系数 = ""; // 设置默认 计产系数 值
  1456. return; // 当前工单为空时,跳到下一行后停止后续逻辑
  1457. }
  1458. // 如果当前工单编号不为空,调用处理函数
  1459. getTableGxMc(event, index, row);
  1460. }
  1461. if(event.keyCode === 13 && title ==='员工编号'){
  1462. //调用员工编号方法
  1463. handleGetYg();
  1464. }
  1465. if(event.keyCode === 13 && title ==='组别'){
  1466. //弹出选择
  1467. const data = [
  1468. {
  1469. 'sczl_bzdh': 'A班'
  1470. },
  1471. {
  1472. 'sczl_bzdh': 'B班'
  1473. },
  1474. ]
  1475. selectDataBz.splice(0, selectDataBz.length, ...data)
  1476. if (dialogSelectVisible_Yg.value == false){
  1477. BzVisible.value = true
  1478. }
  1479. setCurrent(data[0])
  1480. }
  1481. if(event.keyCode === 13 && title ==='冲月定额'){
  1482. const data = [
  1483. {
  1484. 'sczl_冲定额': '是'
  1485. },
  1486. {
  1487. 'sczl_冲定额': '否'
  1488. },
  1489. ]
  1490. selectDataCY.splice(0, selectDataCY.length, ...data)
  1491. BzVisible2.value = true
  1492. setCurrent2(data[0])
  1493. }
  1494. if(event.keyCode === 13 && title ==='核算标准'){
  1495. hsbzVisible.value = true; // 显示弹窗
  1496. editingRow.value = row; // 将当前行数据存储到 editingRow 中
  1497. currentRowIndex.value = 0; // 默认选中第一行
  1498. nextTick(() => {
  1499. updateHighlightRow(); // 高亮弹窗中的第一行
  1500. });
  1501. }
  1502. if(event.keyCode === 13 && title ==='定额代号'){
  1503. getDedhsubmit(event,index,row,title)
  1504. }
  1505. if (event.keyCode === 13 && title === '其他备注') {
  1506. const index = Array.from(formElements).indexOf(event.target);
  1507. const key = event.key;
  1508. console.log(index);
  1509. const currentInputValue = formElements[index].value;
  1510. event.preventDefault();
  1511. switch (index) {
  1512. case 0:
  1513. if (key === 'ArrowRight' ) {
  1514. formElements[1].focus();
  1515. formElements[1].select();
  1516. } else if (key === 'ArrowLeft') {
  1517. formElements[formElements.length - 1].focus();
  1518. formElements[formElements.length - 1].select();
  1519. } else if (key === 'Enter') {
  1520. formElements[1].focus();
  1521. formElements[1].select();
  1522. }
  1523. break;
  1524. case 1:
  1525. if (key === 'ArrowRight') {
  1526. formElements[3].focus();
  1527. formElements[3].select();
  1528. } else if (key === 'ArrowLeft') {
  1529. formElements[0].focus();
  1530. formElements[0].select();
  1531. } else if (key === 'Enter') {
  1532. handleGetYg();
  1533. }
  1534. break;
  1535. case 3:
  1536. if (key === 'ArrowRight') {
  1537. formElements[4].focus();
  1538. formElements[4].select();
  1539. } else if (key === 'ArrowLeft') {
  1540. formElements[1].focus();
  1541. formElements[1].select();
  1542. } else if (key === 'Enter') {
  1543. formElements[4].focus();
  1544. formElements[4].select();
  1545. }
  1546. break;
  1547. case formElements.length - 1:
  1548. if (key === 'ArrowRight') {
  1549. formElements[0].focus();
  1550. formElements[0].select();
  1551. } else if (key === 'ArrowLeft') {
  1552. formElements[index - 1].focus();
  1553. formElements[index - 1].select();
  1554. } else if (key === 'Enter') {
  1555. formElements[0].focus();
  1556. formElements[0].select();
  1557. enterDialog()
  1558. }
  1559. break;
  1560. default:
  1561. if (key === 'ArrowRight') {
  1562. formElements[index + 1].focus();
  1563. formElements[index + 1].select();
  1564. } else if (key === 'ArrowLeft') {
  1565. formElements[index - 1].focus();
  1566. formElements[index - 1].select();
  1567. } else if (key === 'Enter') {
  1568. formElements[index + 1].focus();
  1569. formElements[index + 1].select();
  1570. }
  1571. break;
  1572. }
  1573. }
  1574. if (event.keyCode === 13 || event.keyCode === 40) {
  1575. // Enter 或向下箭头
  1576. for (let i = currentIndex + 1; i < inputs.length; i++) {
  1577. if (!inputs[i].readOnly) {
  1578. nextTick(() => {
  1579. inputs[i].focus();
  1580. inputs[i].select();
  1581. });
  1582. break;
  1583. }
  1584. }
  1585. } else if (event.keyCode === 38) {
  1586. // 向上箭头
  1587. for (let i = currentIndex - 1; i >= 0; i--) {
  1588. if (!inputs[i].readOnly) {
  1589. nextTick(() => {
  1590. inputs[i].focus();
  1591. inputs[i].select();
  1592. });
  1593. break;
  1594. }
  1595. }
  1596. // } else if (event.keyCode === 8) {
  1597. // // 删除箭头
  1598. // if (event.target.selectionStart === 0) {
  1599. // for (let i = currentIndex - 1; i >= 0; i--) {
  1600. // if (!inputs[i].readOnly) {
  1601. // nextTick(() => {
  1602. // inputs[i].focus();
  1603. // inputs[i].setSelectionRange(0, 0);
  1604. // inputs[i].select(); // 全选输入框内容
  1605. // });
  1606. // break;
  1607. // }
  1608. // }
  1609. // }
  1610. } else if (event.keyCode === 37) {
  1611. // 向左箭头
  1612. if (event.target.selectionStart === 0) {
  1613. for (let i = currentIndex - 1; i >= 0; i--) {
  1614. if (!inputs[i].readOnly) {
  1615. nextTick(() => {
  1616. inputs[i].focus();
  1617. inputs[i].select();
  1618. });
  1619. break;
  1620. }
  1621. }
  1622. }
  1623. } else if (event.keyCode === 39) {
  1624. // 向右箭头
  1625. if (event.target.selectionStart === event.target.value.length) {
  1626. for (let i = currentIndex + 1; i < inputs.length; i++) {
  1627. if (!inputs[i].readOnly) {
  1628. nextTick(() => {
  1629. inputs[i].focus();
  1630. inputs[i].select();
  1631. });
  1632. break;
  1633. }
  1634. }
  1635. }
  1636. }
  1637. };
  1638. </script>
  1639. <style scoped>
  1640. :deep(.plan-usage-low div) {
  1641. color: red !important;
  1642. }
  1643. .JKWTree-container {
  1644. display: flex;
  1645. }
  1646. .JKWTree-tree {
  1647. width: 100%;
  1648. background-color: #fff;
  1649. /*background-color: rgba(241, 224, 224, 0.99);*/
  1650. padding: 10px;
  1651. margin-right: 20px;
  1652. }
  1653. .JKWTree-tree h3 {
  1654. font-size: 15px;
  1655. font-weight: 700;
  1656. margin: 10px 0;
  1657. }
  1658. .JKWTree-content {
  1659. flex: 1;
  1660. }
  1661. :deep(.el-table__body .warning-row) {
  1662. background: #FFFF80 !important;
  1663. }
  1664. /* 选中某行时的背景色 */
  1665. :deep(.el-table__body tr.current-row)>td {
  1666. background: #ff80ff !important;
  1667. }
  1668. :deep(.el-table .bg-yellow) {
  1669. background: yellow;
  1670. }
  1671. </style>
  1672. <style scoped>
  1673. :deep(.el-table td .cell) {
  1674. line-height: 25px !important;
  1675. }
  1676. :deep(.el-tabs__header) {
  1677. margin-bottom: 0;
  1678. }
  1679. .search {
  1680. margin-left: 0px !important;
  1681. margin-right: 10px !important;
  1682. }
  1683. .bt {
  1684. margin-left: 2px !important;
  1685. padding: 3px !important;
  1686. font-size: 12px;
  1687. }
  1688. .el-tabs__header {
  1689. margin: 0px !important;
  1690. }
  1691. .gva-table-box {
  1692. padding: 0px !important;
  1693. }
  1694. .mab {
  1695. margin-bottom: 5px;
  1696. }
  1697. /* tree组件背景高亮 */
  1698. :deep(.el-tree-node:focus > .el-tree-node__content){
  1699. background: #ff80ff !important;
  1700. }
  1701. </style>