index.vue 14 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520
  1. <template>
  2. <div>
  3. <!-- 左侧树形结构 -->
  4. <el-container>
  5. <el-aside width="250px">
  6. <div class="JKWTree-tree">
  7. <h3>包装计件单据维护</h3>
  8. <el-tree :data="treeData" :props="defaultProps" highlight-current="true"
  9. @node-click="handleNodeClick"></el-tree>
  10. </div>
  11. </el-aside>
  12. <el-container>
  13. <el-main>
  14. <!-- 按钮区域 -->
  15. <div class="gva-table-box">
  16. <div class="gva-btn-list">
  17. <el-row :span="6">
  18. <el-input v-model="searchInfo" placeholder="输入工单编号或产品名称" />
  19. </el-row>
  20. <el-button type="primary" :icon="Search" @click="onSearch">搜索</el-button>
  21. <el-button type="primary" :icon="Refresh">重置</el-button>
  22. <div style="margin-left: auto;">
  23. <el-button type="primary" :icon="Download" @click="exportExcel">导出到Excel</el-button>
  24. </div>
  25. </div>
  26. <!-- 数据展示 -->
  27. <el-table ref="multipleTable" style="width: 100%" tooltip-effect="dark" :data="tableData" row-key="ID"
  28. highlight-current-row="true" border @selection-change="handleSelectionChange" @row-dblclick="doubleClick">
  29. <el-table-column type="selection" width="55" />
  30. <el-table-column align="left" label="员工编号" prop="sczl_bh" />
  31. <el-table-column align="left" label="员工姓名" prop="name" />
  32. <el-table-column align="left" label="生产日期" prop="sczl_rq" />
  33. <el-table-column align="left" label="班组" prop="sczl_bzdh" />
  34. <el-table-column align="left" label="包装产量" prop="sczl_cl" />
  35. <el-table-column align="left" label="返工产量" prop="sczl_fgsl" />
  36. <el-table-column align="left" label="计件产量" prop="sczl_jjcl" />
  37. <el-table-column align="left" label="相关工单" prop="sczl_gdbh1" />
  38. <el-table-column align="left" label="创建用户" prop="sys_id" />
  39. <el-table-column align="left" label="创建时间" prop="sys_rq" />
  40. <el-table-column align="left" label="修改时间" prop="mod_rq" />
  41. <el-table-column align="left" label="UNIQID" prop="UniqId" />
  42. </el-table>
  43. <!-- 分页 -->
  44. <div class="gva-pagination">
  45. <el-pagination layout="total, sizes, prev, pager, next, jumper" :current-page="page" :page-size="limit"
  46. :page-sizes="[10, 30, 50, 100]" :total="total" @current-change="handleCurrentChange"
  47. @size-change="handleSizeChange" />
  48. </div>
  49. </div>
  50. <!-- 弹出框 -->
  51. <el-dialog v-model="dialogFormVisible" :before-close="closeDialog" :title="type === 'create' ? '添加' : '修改'"
  52. destroy-on-close width="1200px">
  53. <!-- <el-scrollbar height="500px"> -->
  54. <el-form :model="formData" label-position="left" ref="elFormRef" :rules="rule">
  55. <el-row :gutter="20">
  56. <el-col :span="4">
  57. <el-form-item label="日期" prop="id">
  58. <el-input v-model="formData.address" :clearable="true" placeholder="2023.12.14" />
  59. </el-form-item>
  60. </el-col>
  61. <el-col :span="6">
  62. <el-form-item label="员工编号" prop="name">
  63. <el-row :gutter="20">
  64. <el-col :span="12">
  65. <el-input v-model="formData.code" :clearable="true" placeholder="ZT01733" />
  66. </el-col>
  67. <el-col :span="12">
  68. <el-input v-model="formData.name" :clearable="true" placeholder="张玉田" />
  69. </el-col>
  70. </el-row>
  71. </el-form-item>
  72. </el-col>
  73. <el-col :span="3">
  74. <el-form-item label="组别" prop="name">
  75. <el-input v-model="formData.image" :clearable="true" placeholder="A班" />
  76. </el-form-item>
  77. </el-col>
  78. </el-row>
  79. <el-row :gutter="20">
  80. <el-col :span="4">
  81. </el-col>
  82. <el-col :span="8">
  83. <el-row :gutter="20">
  84. <el-col :span="14">
  85. <el-form-item label="计时时数" prop="id">
  86. <el-input v-model="formData.address" :clearable="true" placeholder="0.00" />
  87. </el-form-item>
  88. </el-col>
  89. <el-col :span="10">
  90. <el-form-item label="冲月定额" prop="id">
  91. <el-input v-model="formData.address" :clearable="true" placeholder="是" />
  92. </el-form-item>
  93. </el-col>
  94. </el-row>
  95. </el-col>
  96. </el-row>
  97. <el-scrollbar height="300px">
  98. <el-table style="width: 100%" :data="detailData">
  99. <el-table-column prop="gdbh" label="工单编号" width="80"></el-table-column>
  100. <el-table-column prop="yjgx" label="印件工序" width="80"></el-table-column>
  101. <el-table-column prop="gxmc" label="工序名称" width="100"></el-table-column>
  102. <el-table-column prop="yjmc" label="印件名称"></el-table-column>
  103. <el-table-column prop="bzcl" label="包装产量" width="80"></el-table-column>
  104. <el-table-column prop="fgcl" label="返工产量" width="80"></el-table-column>
  105. <el-table-column prop="mxsl" label="每箱数量" width="80"></el-table-column>
  106. <el-table-column prop="jcxs" label="计产系数" width="80"></el-table-column>
  107. <el-table-column prop="ly" label="来源" width="80"></el-table-column>
  108. <el-table-column prop="dedh" label="定额代号" width="100"></el-table-column>
  109. </el-table>
  110. </el-scrollbar>
  111. <el-form-item label="其他备注" prop="id" style="margin-top: 10px;">
  112. <el-input v-model="formData.address" :clearable="true" placeholder="" />
  113. </el-form-item>
  114. </el-form>
  115. <!-- </el-scrollbar> -->
  116. <template #footer>
  117. <div class="dialog-footer">
  118. <el-button @click="closeDialog">取 消</el-button>
  119. <el-button type="primary" @click="enterDialog">确 定</el-button>
  120. </div>
  121. </template>
  122. </el-dialog>
  123. </el-main>
  124. </el-container>
  125. </el-container>
  126. </div>
  127. </template>
  128. <script setup>
  129. import {
  130. createCompany,
  131. deleteCompany,
  132. deleteCompanyByIds,
  133. updateCompany,
  134. findCompany,
  135. getCompanyList
  136. } from '@/api/company'
  137. // 全量引入格式化工具 请按需保留
  138. import { getDictFunc, formatDate, formatBoolean, filterDict, ReturnArrImg, onDownloadFile } from '@/utils/format'
  139. import { ElMessage, ElMessageBox } from 'element-plus'
  140. import { Search, Refresh, Download } from '@element-plus/icons-vue'
  141. import { ref, reactive, onMounted, onBeforeMount } from 'vue'
  142. import { getPackingSideTable, getPackingTable } from '@/api/mes_api_gty/myapi'
  143. defineOptions({
  144. name: '06-packingDocuments'
  145. })
  146. // 侧边栏数据请求
  147. const treeData = reactive([]);
  148. const getSideData = async () => {
  149. const response = await getPackingSideTable();
  150. if (response.code === 0) {
  151. const transformedData = response.data.map(item => ({
  152. label: `${item.date.replace(/-/g, '.')}【单据数: ${item.counts}张】`,
  153. children: item.sys.map(sysItem => ({
  154. label: `${sysItem.sys_id} 【记录数: ${sysItem.count}张】`,
  155. params: {
  156. date: item.date.replace(/\./g, '-'),
  157. sys_id: sysItem.sys_id,
  158. total: sysItem.count,
  159. },
  160. })),
  161. }));
  162. treeData.splice(0, treeData.length, ...transformedData);
  163. }
  164. };
  165. getSideData();
  166. // 自动化生成的字典(可能为空)以及字段
  167. const formData = ref({
  168. id: '',
  169. name: '',
  170. date: '',
  171. group: '',
  172. packingOutput: '',
  173. reworkOutput: '',
  174. pieceOutput: '',
  175. order: '',
  176. user: '',
  177. createTime: '',
  178. updateTime: '',
  179. uniqid: '',
  180. })
  181. // 验证规则
  182. const rule = reactive({
  183. })
  184. const elFormRef = ref()
  185. const elSearchFormRef = ref()
  186. // =========== 表格控制部分 ===========
  187. const tableData = reactive([])
  188. const detailData = reactive([
  189. {
  190. gdbh: '2311736',
  191. yjgx: '01-15',
  192. gxmc: '包装(圆切)',
  193. yjmc: '利群(新)小《降焦改版)',
  194. bzcl: '13.00',
  195. fgcl: '0.00',
  196. mxsl: '2500',
  197. jcxs: '1.000',
  198. ly: '',
  199. dedh: '030002002',
  200. },
  201. {
  202. gdbh: '2311736',
  203. yjgx: '01-15',
  204. gxmc: '包装(圆切)',
  205. yjmc: '利群(新)小《降焦改版)',
  206. bzcl: '13.00',
  207. fgcl: '0.00',
  208. mxsl: '2500',
  209. jcxs: '1.000',
  210. ly: '',
  211. dedh: '030002002',
  212. },
  213. {
  214. gdbh: '2311736',
  215. yjgx: '01-15',
  216. gxmc: '包装(圆切)',
  217. yjmc: '利群(新)小《降焦改版)',
  218. bzcl: '13.00',
  219. fgcl: '0.00',
  220. mxsl: '2500',
  221. jcxs: '1.000',
  222. ly: '',
  223. dedh: '030002002',
  224. },
  225. {
  226. gdbh: '2311736',
  227. yjgx: '01-15',
  228. gxmc: '包装(圆切)',
  229. yjmc: '利群(新)小《降焦改版)',
  230. bzcl: '13.00',
  231. fgcl: '0.00',
  232. mxsl: '2500',
  233. jcxs: '1.000',
  234. ly: '',
  235. dedh: '030002002',
  236. },
  237. {
  238. gdbh: '2311736',
  239. yjgx: '01-15',
  240. gxmc: '包装(圆切)',
  241. yjmc: '利群(新)小《降焦改版)',
  242. bzcl: '13.00',
  243. fgcl: '0.00',
  244. mxsl: '2500',
  245. jcxs: '1.000',
  246. ly: '',
  247. dedh: '030002002',
  248. },
  249. {
  250. gdbh: '2311736',
  251. yjgx: '01-15',
  252. gxmc: '包装(圆切)',
  253. yjmc: '利群(新)小《降焦改版)',
  254. bzcl: '13.00',
  255. fgcl: '0.00',
  256. mxsl: '2500',
  257. jcxs: '1.000',
  258. ly: '',
  259. dedh: '030002002',
  260. },
  261. {
  262. gdbh: '2311736',
  263. yjgx: '01-15',
  264. gxmc: '包装(圆切)',
  265. yjmc: '利群(新)小《降焦改版)',
  266. bzcl: '13.00',
  267. fgcl: '0.00',
  268. mxsl: '2500',
  269. jcxs: '1.000',
  270. ly: '',
  271. dedh: '030002002',
  272. },
  273. {
  274. gdbh: '2311736',
  275. yjgx: '01-15',
  276. gxmc: '包装(圆切)',
  277. yjmc: '利群(新)小《降焦改版)',
  278. bzcl: '13.00',
  279. fgcl: '0.00',
  280. mxsl: '2500',
  281. jcxs: '1.000',
  282. ly: '',
  283. dedh: '030002002',
  284. },
  285. {
  286. gdbh: '2311736',
  287. yjgx: '01-15',
  288. gxmc: '包装(圆切)',
  289. yjmc: '利群(新)小《降焦改版)',
  290. bzcl: '13.00',
  291. fgcl: '0.00',
  292. mxsl: '2500',
  293. jcxs: '1.000',
  294. ly: '',
  295. dedh: '030002002',
  296. },
  297. {
  298. gdbh: '2311736',
  299. yjgx: '01-15',
  300. gxmc: '包装(圆切)',
  301. yjmc: '利群(新)小《降焦改版)',
  302. bzcl: '13.00',
  303. fgcl: '0.00',
  304. mxsl: '2500',
  305. jcxs: '1.000',
  306. ly: '',
  307. dedh: '030002002',
  308. },
  309. ])
  310. const total = ref(0)
  311. const page = ref(1)
  312. const limit = ref(10)
  313. const searchInfo = ref('')
  314. const params = {
  315. date: '',
  316. sys_id: '',
  317. page: page.value.toString(),
  318. limit: limit.value.toString(),
  319. }
  320. // 分页设置
  321. const handleSizeChange = (val) => {
  322. limit.value = val;
  323. params.limit = val.toString();
  324. getTableData();
  325. }
  326. // 页面跳转
  327. const handleCurrentChange = (val) => {
  328. page.value = val
  329. params.page = val.toString();
  330. getTableData()
  331. }
  332. const getTableData = async () => {
  333. const response = await getPackingTable(params);
  334. if (response.code === 0) {
  335. tableData.splice(0, tableData.length, ...response.data.rows);
  336. }
  337. }
  338. const handleNodeClick = (node, check) => {
  339. if (node.params) {
  340. params.date = node.params.date;
  341. params.sys_id = node.params.sys_id;
  342. total.value = node.params.total;
  343. handleCurrentChange(1);
  344. }
  345. }
  346. // 搜索
  347. function onSearch() {
  348. }
  349. // ============== 表格控制部分结束 ===============
  350. // 获取需要的字典 可能为空 按需保留
  351. const setOptions = async () => {
  352. }
  353. // 获取需要的字典 可能为空 按需保留
  354. setOptions()
  355. // 多选数据
  356. const multipleSelection = ref([])
  357. // 多选
  358. const handleSelectionChange = (val) => {
  359. multipleSelection.value = val
  360. }
  361. // 批量删除控制标记
  362. const deleteVisible = ref(false)
  363. // 多选删除
  364. const onDelete = async () => {
  365. const ids = []
  366. if (multipleSelection.value.length === 0) {
  367. ElMessage({
  368. type: 'warning',
  369. message: '请选择要删除的数据'
  370. })
  371. return
  372. }
  373. multipleSelection.value &&
  374. multipleSelection.value.map(item => {
  375. ids.push(item.ID)
  376. })
  377. const res = await deleteCompanyByIds({ ids })
  378. if (res.code === 0) {
  379. ElMessage({
  380. type: 'success',
  381. message: '删除成功'
  382. })
  383. if (tableData.value.length === ids.length && page.value > 1) {
  384. page.value--
  385. }
  386. deleteVisible.value = false
  387. getTableData()
  388. }
  389. }
  390. // 行为控制标记(弹窗内部需要增还是改)
  391. const type = ref('')
  392. // 更新行
  393. const updateCompanyFunc = async (row) => {
  394. const res = await findCompany({ ID: row.ID })
  395. type.value = 'update'
  396. if (res.code === 0) {
  397. formData.value = res.data.recompany
  398. dialogFormVisible.value = true
  399. }
  400. }
  401. // 弹窗控制标记
  402. const dialogFormVisible = ref(false)
  403. // 打开弹窗
  404. const openDialog = () => {
  405. type.value = 'create'
  406. dialogFormVisible.value = true
  407. }
  408. // 关闭弹窗
  409. const closeDialog = () => {
  410. dialogFormVisible.value = false
  411. formData.value = {
  412. address: '',
  413. image: '',
  414. name: '',
  415. }
  416. }
  417. // 弹窗确定
  418. const enterDialog = async () => {
  419. elFormRef.value?.validate(async (valid) => {
  420. if (!valid) return
  421. let res
  422. switch (type.value) {
  423. case 'create':
  424. res = await createCompany(formData.value)
  425. break
  426. case 'update':
  427. res = await updateCompany(formData.value)
  428. break
  429. default:
  430. res = await createCompany(formData.value)
  431. break
  432. }
  433. if (res.code === 0) {
  434. ElMessage({
  435. type: 'success',
  436. message: '创建/更改成功'
  437. })
  438. closeDialog()
  439. getTableData()
  440. }
  441. })
  442. }
  443. // 双击表格操作
  444. function doubleClick(row, column, event) {
  445. console.log(row, column, event);
  446. // updateCompanyFunc(row);
  447. type.value = 'update';
  448. dialogFormVisible.value = true
  449. }
  450. // 导出excel
  451. function exportExcel() {
  452. console.log('导出到excel');
  453. }
  454. // 生命周期钩子
  455. onMounted(async () => {
  456. });
  457. </script >
  458. <style scoped>
  459. .JKWTree-container {
  460. display: flex;
  461. }
  462. .JKWTree-tree {
  463. width: 300px;
  464. background-color: #fff;
  465. padding: 10px;
  466. margin-right: 20px;
  467. }
  468. .JKWTree-tree h3 {
  469. font-size: 15px;
  470. font-weight: 700;
  471. margin: 10px 0;
  472. }
  473. .JKWTree-content {
  474. flex: 1;
  475. }
  476. /* 选中某行时的背景色*/
  477. ::v-deep .el-table__body tr.current-row>td {
  478. background: #ff80ff !important;
  479. }
  480. </style>