piece.vue 17 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565
  1. <template>
  2. <div>
  3. <el-container>
  4. <el-aside width="350px">
  5. <div class="JKWTree-tree">
  6. <h3>计件定额管理</h3>
  7. <el-tree :data="treeData" :props="defaultProps" @node-click="handleNodeClick"></el-tree>
  8. </div>
  9. </el-aside>
  10. <el-container>
  11. <el-main>
  12. <div class="gva-search-box">
  13. <!-- <el-form ref="elSearchFormRef" :inline="true" :model="searchInfo" class="demo-form-inline" :rules="searchRule" @keyup.enter="onSubmit">
  14. <el-form-item label="创建日期" prop="createdAt">
  15. <template #label>
  16. <span>
  17. 创建日期
  18. <el-tooltip content="搜索范围是开始日期(包含)至结束日期(不包含)">
  19. <el-icon><QuestionFilled /></el-icon>
  20. </el-tooltip>
  21. </span>
  22. </template>
  23. <el-date-picker v-model="searchInfo.startCreatedAt" type="datetime" placeholder="开始日期" :disabled-date="time=> searchInfo.endCreatedAt ? time.getTime() > searchInfo.endCreatedAt.getTime() : false"></el-date-picker>
  24. <el-date-picker v-model="searchInfo.endCreatedAt" type="datetime" placeholder="结束日期" :disabled-date="time=> searchInfo.startCreatedAt ? time.getTime() < searchInfo.startCreatedAt.getTime() : false"></el-date-picker>
  25. </el-form-item>
  26. <el-form-item>
  27. <el-button type="primary" icon="search" @click="onSubmit">查询</el-button>
  28. <el-button icon="refresh" @click="onReset">重置</el-button>
  29. </el-form-item>
  30. </el-form> -->
  31. <div class="gva-btn-list">
  32. <el-button type="primary" icon="upload" @click="">定额参数批量修改excel</el-button>
  33. <el-button type="primary" icon="plus" @click="">更新</el-button>
  34. </div>
  35. </div>
  36. <div class="gva-table-box">
  37. <!-- <div class="gva-btn-list">
  38. <el-button type="primary" icon="upload" @click="">导出到excel</el-button>
  39. <el-button type="primary" icon="plus" @click="getDetails(2)">详情</el-button>
  40. </div> -->
  41. <el-table
  42. ref="multipleTable"
  43. border
  44. style="width: 100%"
  45. tooltip-effect="dark"
  46. :data="tableData"
  47. row-key="ID"
  48. @selection-change="handleSelectionChange"
  49. @row-dblclick="updateCompanyFunc"
  50. :show-overflow-tooltip="true"
  51. highlight-current-row="true"
  52. >
  53. <el-table-column align="left" label="定额代号" prop="address" width="90" />
  54. <el-table-column align="left" label="名称备注" prop="image" width="90" />
  55. <el-table-column align="left" label="使用工序" prop="name" width="90" />
  56. <el-table-column align="left" label="适用机型" prop="address" width="90" />
  57. <el-table-column align="left" label="原日定额" prop="image" width="90" />
  58. <el-table-column align="left" label="原千件工价" prop="name" width="100" />
  59. <el-table-column align="left" label="原补产标准" prop="address" width="100" />
  60. <el-table-column align="left" label="新日定额" prop="image" width="100" >
  61. <el-input v-model="formData.daily_quota" :clearable="true"/>
  62. </el-table-column>
  63. <el-table-column align="left" label="新千件工价" prop="name" width="100" >
  64. <el-input v-model="formData.thousand_piece" :clearable="true"/>
  65. </el-table-column>
  66. <el-table-column align="left" label="新补产标准" prop="address" width="100">
  67. <el-input v-model="formData.production_standard" :clearable="true"/>
  68. </el-table-column>
  69. <el-table-column align="left" v-if="false" label="新补产标准" prop="UniqId" width="100">
  70. <el-input v-model="formData.UniqId" :clearable="true"/>
  71. </el-table-column>
  72. </el-table>
  73. <div class="gva-pagination">
  74. <el-pagination
  75. layout="total, sizes, prev, pager, next, jumper"
  76. :current-page="page"
  77. :page-size="pageSize"
  78. :page-sizes="[10, 30, 50, 100]"
  79. :total="total"
  80. @current-change="handleCurrentChange"
  81. @size-change="handleSizeChange"
  82. />
  83. </div>
  84. </div>
  85. <el-dialog v-model="dialogFormVisible" :before-close="closeDialog" :title="type==='create'?'添加':'修改'" destroy-on-close>
  86. <el-scrollbar height="500px">
  87. <el-form :model="formData" label-position="right" ref="elFormRef" :rules="rule" label-width="80px">
  88. <el-form-item label="address字段:" prop="address" >
  89. <el-input v-model="formData.address" :clearable="true" placeholder="请输入address字段" />
  90. </el-form-item>
  91. <el-form-item label="image字段:" prop="image" >
  92. <el-input v-model="formData.image" :clearable="true" placeholder="请输入image字段" />
  93. </el-form-item>
  94. <el-form-item label="name字段:" prop="name" >
  95. <el-input v-model="formData.name" :clearable="true" placeholder="请输入name字段" />
  96. </el-form-item>
  97. </el-form>
  98. </el-scrollbar>
  99. <template #footer>
  100. <div class="dialog-footer">
  101. <el-button @click="closeDialog">取 消</el-button>
  102. <el-button type="primary" @click="enterDialog">确 定</el-button>
  103. </div>
  104. </template>
  105. </el-dialog>
  106. <el-dialog v-model="detailShow" style="width: 800px" lock-scroll :before-close="closeDetailShow" :title="`当前编码:${pieceData.sys_bh}`" destroy-on-close>
  107. <el-scrollbar height="300px">
  108. <el-descriptions column="1" border>
  109. <el-descriptions-item label="编号">
  110. {{ pieceData.sys_bh }}
  111. </el-descriptions-item>
  112. <el-descriptions-item label="名称">
  113. {{ pieceData.sys_mc }}
  114. </el-descriptions-item>
  115. <el-descriptions-item label="适用工序">
  116. {{ pieceData.sygx }}
  117. </el-descriptions-item>
  118. <el-descriptions-item label="适用机型">
  119. {{ pieceData.syjx }}
  120. </el-descriptions-item>
  121. </el-descriptions>
  122. <el-descriptions column="3" border>
  123. <el-descriptions-item label="日定额">
  124. {{ pieceData.daily_quota }}
  125. </el-descriptions-item>
  126. <el-descriptions-item label="千件工价">
  127. {{ pieceData.thousand_piece }}
  128. </el-descriptions-item>
  129. <el-descriptions-item label="小时补产标准">
  130. {{ pieceData.production_standard }}
  131. </el-descriptions-item>
  132. </el-descriptions>
  133. <el-descriptions column="10" direction="vertical" border>
  134. <el-descriptions-item label="机长">
  135. {{ pieceData.fir_proportion }}
  136. </el-descriptions-item>
  137. <el-descriptions-item label="副机">
  138. {{ pieceData.sec_proportion }}
  139. </el-descriptions-item>
  140. <el-descriptions-item label="调墨">
  141. {{ pieceData.ink_proportion }}
  142. </el-descriptions-item>
  143. <el-descriptions-item label="二手">
  144. {{ pieceData.second_hand_proportion }}
  145. </el-descriptions-item>
  146. <el-descriptions-item label="飞达">
  147. {{ pieceData.feeder_proportion }}
  148. </el-descriptions-item>
  149. <el-descriptions-item label="辅助">
  150. {{ pieceData.auxiliary_proportion }}
  151. </el-descriptions-item>
  152. <el-descriptions-item label="放卷">
  153. {{ pieceData.unwinder_proportion }}
  154. </el-descriptions-item>
  155. <el-descriptions-item label="分切1">
  156. {{ pieceData.cutting_one_proportion }}
  157. </el-descriptions-item>
  158. <el-descriptions-item label="分切2">
  159. {{ pieceData.cutting_two_proportion }}
  160. </el-descriptions-item>
  161. <el-descriptions-item label="检验">
  162. {{ pieceData.inspect_proportion }}
  163. </el-descriptions-item>
  164. </el-descriptions>
  165. </el-scrollbar>
  166. </el-dialog>
  167. </el-main>
  168. </el-container>
  169. </el-container>
  170. </div>
  171. </template>
  172. <script setup>
  173. import {
  174. getOnePieceWork,
  175. getPieceWork
  176. } from '@/api/mes/job'
  177. import {
  178. createCompany,
  179. deleteCompany,
  180. deleteCompanyByIds,
  181. updateCompany,
  182. findCompany,
  183. getCompanyList
  184. } from '@/api/company'
  185. // 全量引入格式化工具 请按需保留
  186. import { getDictFunc, formatDate, formatBoolean, filterDict, ReturnArrImg, onDownloadFile } from '@/utils/format'
  187. import { ElMessage, ElMessageBox } from 'element-plus'
  188. import { ref, reactive } from 'vue'
  189. defineOptions({
  190. name: 'Company'
  191. })
  192. const treeData=ref([])
  193. const PieceWork = async() => {
  194. const getPieceWorks = await getPieceWork()
  195. if (getPieceWorks.code === 0) {
  196. const transformedData1 = getPieceWorks.data.machineData.map(item => ({
  197. label: `${item.sys_mc}【${item.sys_bh}】`,
  198. params: {
  199. code: item.sys_bh,
  200. },
  201. children: item.child.map(sysItem => ({
  202. label: `${sysItem.gx} ${sysItem.jx}【${sysItem.sys_bh}】`,
  203. params: {
  204. code: sysItem.sys_bh,
  205. },
  206. children: sysItem.children.map(syssItem => ({
  207. label: `${syssItem.sys_mc}【${syssItem.sys_bh}】`,
  208. params: {
  209. code: syssItem.sys_bh,
  210. },
  211. }))
  212. })),
  213. }));
  214. const transformedData2 = getPieceWorks.data.handData.map(item => ({
  215. label: `${item.gx}【${item.sys_bh}】`,
  216. params: {
  217. code: item.sys_bh,
  218. },
  219. children: item.child.map(sysItem => ({
  220. label: `${sysItem.sys_mc}【${sysItem.sys_bh}】`,
  221. params: {
  222. code: sysItem.sys_bh,
  223. },
  224. children: sysItem.children.map(syssItem => ({
  225. label: `${syssItem.sys_mc}【${syssItem.sys_bh}】`,
  226. params: {
  227. code: syssItem.sys_bh,
  228. },
  229. }))
  230. })),
  231. }));
  232. treeData.value = [
  233. {
  234. label: '机器作业计件定额',
  235. children:transformedData1,
  236. code:'020'
  237. },
  238. {
  239. label: '人工作业计件定额',
  240. children:transformedData2,
  241. code:'030'
  242. }
  243. ]
  244. }
  245. }
  246. PieceWork()
  247. const handleNodeClick = (node,check) => {
  248. //存放当前节点的nodeId
  249. // if (node.paramss) {
  250. // sys_bh.value = node.paramss.code;
  251. // getDetails();
  252. // return false;
  253. // }
  254. // if (node.params) {
  255. // sys_bh.value = node.params.code;
  256. // getDetails();
  257. // }
  258. if(node.children==null){
  259. sys_bh.value = node.params.code;
  260. getDetails();
  261. }else{
  262. if(node.children.length==0){
  263. sys_bh.value = node.params.code;
  264. getDetails();
  265. }
  266. }
  267. if(node.params){
  268. code.value=node.params.code
  269. }else{
  270. code.value=node.code
  271. }
  272. console.log(node.code);
  273. // console.log(node,check);
  274. }
  275. // 自动化生成的字典(可能为空)以及字段
  276. const formData = ref({
  277. address: '',
  278. image: '',
  279. name: '',
  280. })
  281. // 验证规则
  282. const rule = reactive({
  283. })
  284. const searchRule = reactive({
  285. createdAt: [
  286. { validator: (rule, value, callback) => {
  287. if (searchInfo.value.startCreatedAt && !searchInfo.value.endCreatedAt) {
  288. callback(new Error('请填写结束日期'))
  289. } else if (!searchInfo.value.startCreatedAt && searchInfo.value.endCreatedAt) {
  290. callback(new Error('请填写开始日期'))
  291. } else if (searchInfo.value.startCreatedAt && searchInfo.value.endCreatedAt && (searchInfo.value.startCreatedAt.getTime() === searchInfo.value.endCreatedAt.getTime() || searchInfo.value.startCreatedAt.getTime() > searchInfo.value.endCreatedAt.getTime())) {
  292. callback(new Error('开始日期应当早于结束日期'))
  293. } else {
  294. callback()
  295. }
  296. }, trigger: 'change' }
  297. ],
  298. })
  299. const elFormRef = ref()
  300. const elSearchFormRef = ref()
  301. // =========== 表格控制部分 ===========
  302. const page = ref(1)
  303. const total = ref(0)
  304. const pageSize = ref(10)
  305. const tableData = ref([])
  306. const searchInfo = ref({})
  307. const sys_bh = ref()
  308. const code = ref()
  309. const pieceData = ref([])
  310. // 重置
  311. const onReset = () => {
  312. searchInfo.value = {}
  313. getTableData()
  314. }
  315. // 搜索
  316. const onSubmit = () => {
  317. elSearchFormRef.value?.validate(async(valid) => {
  318. if (!valid) return
  319. page.value = 1
  320. pageSize.value = 10
  321. getTableData()
  322. })
  323. }
  324. // 分页
  325. const handleSizeChange = (val) => {
  326. pageSize.value = val
  327. getTableData()
  328. }
  329. // 修改页面容量
  330. const handleCurrentChange = (val) => {
  331. page.value = val
  332. getTableData()
  333. }
  334. // 查询
  335. const getTableData = async() => {
  336. const table = await getCompanyList({ page: page.value, pageSize: pageSize.value, ...searchInfo.value })
  337. if (table.code === 0) {
  338. tableData.value = table.data.list
  339. total.value = table.data.total
  340. page.value = table.data.page
  341. pageSize.value = table.data.pageSize
  342. }
  343. }
  344. getTableData()
  345. // ============== 表格控制部分结束 ===============
  346. // 获取需要的字典 可能为空 按需保留
  347. const setOptions = async () =>{
  348. }
  349. // 获取需要的字典 可能为空 按需保留
  350. setOptions()
  351. // 多选数据
  352. const multipleSelection = ref([])
  353. // 多选
  354. const handleSelectionChange = (val) => {
  355. multipleSelection.value = val
  356. }
  357. // 删除行
  358. const deleteRow = (row) => {
  359. ElMessageBox.confirm('确定要删除吗?', '提示', {
  360. confirmButtonText: '确定',
  361. cancelButtonText: '取消',
  362. type: 'warning'
  363. }).then(() => {
  364. deleteCompanyFunc(row)
  365. })
  366. }
  367. // 批量删除控制标记
  368. const deleteVisible = ref(false)
  369. // 多选删除
  370. const onDelete = async() => {
  371. const ids = []
  372. if (multipleSelection.value.length === 0) {
  373. ElMessage({
  374. type: 'warning',
  375. message: '请选择要删除的数据'
  376. })
  377. return
  378. }
  379. multipleSelection.value &&
  380. multipleSelection.value.map(item => {
  381. ids.push(item.ID)
  382. })
  383. const res = await deleteCompanyByIds({ ids })
  384. if (res.code === 0) {
  385. ElMessage({
  386. type: 'success',
  387. message: '删除成功'
  388. })
  389. if (tableData.value.length === ids.length && page.value > 1) {
  390. page.value--
  391. }
  392. deleteVisible.value = false
  393. getTableData()
  394. }
  395. }
  396. // 行为控制标记(弹窗内部需要增还是改)
  397. const type = ref('')
  398. // 更新行
  399. const updateCompanyFunc = async(row) => {
  400. const res = await findCompany({ ID: row.ID })
  401. type.value = 'update'
  402. if (res.code === 0) {
  403. formData.value = res.data.recompany
  404. dialogFormVisible.value = true
  405. }
  406. }
  407. // 删除行
  408. const deleteCompanyFunc = async (row) => {
  409. const res = await deleteCompany({ ID: row.ID })
  410. if (res.code === 0) {
  411. ElMessage({
  412. type: 'success',
  413. message: '删除成功'
  414. })
  415. if (tableData.value.length === 1 && page.value > 1) {
  416. page.value--
  417. }
  418. getTableData()
  419. }
  420. }
  421. // 弹窗控制标记
  422. const dialogFormVisible = ref(false)
  423. // 查看详情控制标记
  424. const detailShow = ref(false)
  425. // 打开详情弹窗
  426. const openDetailShow = () => {
  427. detailShow.value = true
  428. }
  429. // 打开详情
  430. const getDetails = async () => {
  431. const getOnePieceWorks = await getOnePieceWork({code:sys_bh.value})
  432. if (getOnePieceWorks.code === 0) {
  433. // getProcessLosss.data[0].forEach(function(i,index){
  434. // console.log(i)
  435. // })
  436. pieceData.value=getOnePieceWorks.data[0]
  437. openDetailShow()
  438. }
  439. openDetailShow()
  440. // 打开弹窗
  441. // const res = await findCompany({ ID: row })
  442. // if (res.code === 0) {
  443. // formData.value = res.data.recompany
  444. // openDetailShow()
  445. // }
  446. }
  447. // 关闭详情弹窗
  448. const closeDetailShow = () => {
  449. detailShow.value = false
  450. formData.value = {
  451. address: '',
  452. image: '',
  453. name: '',
  454. }
  455. }
  456. // 打开弹窗
  457. const openDialog = () => {
  458. // type.value = 'create'
  459. dialogFormVisible.value = true
  460. }
  461. // 关闭弹窗
  462. const closeDialog = () => {
  463. dialogFormVisible.value = false
  464. formData.value = {
  465. address: '',
  466. image: '',
  467. name: '',
  468. }
  469. }
  470. // 弹窗确定
  471. const enterDialog = async () => {
  472. elFormRef.value?.validate( async (valid) => {
  473. if (!valid) return
  474. let res
  475. switch (type.value) {
  476. case 'create':
  477. res = await createCompany(formData.value)
  478. break
  479. case 'update':
  480. res = await updateCompany(formData.value)
  481. break
  482. default:
  483. res = await createCompany(formData.value)
  484. break
  485. }
  486. if (res.code === 0) {
  487. ElMessage({
  488. type: 'success',
  489. message: '创建/更改成功'
  490. })
  491. closeDialog()
  492. getTableData()
  493. }
  494. })
  495. }
  496. </script>
  497. <style>
  498. .JKWTree-container {
  499. display: flex;
  500. }
  501. .JKWTree-tree {
  502. width: 350px;
  503. background-color: #fff;
  504. padding: 10px;
  505. margin-right: 20px;
  506. }
  507. .JKWTree-tree h3 {
  508. font-size: 15px;
  509. font-weight: 700;
  510. margin: 10px 0;
  511. }
  512. .JKWTree-content {
  513. flex: 1;
  514. }
  515. </style>