index.vue 17 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684
  1. <!-- 采购订单修订—— 列表 -->
  2. <script>
  3. import { TableColumns, SearchColumns, TabColumns, SelectColumns } from "./column";
  4. import orderApi from "@/api/business/purchase/purchase-order";
  5. import {
  6. initPage,
  7. initParams,
  8. // initDicts,
  9. } from "@/utils/init/index.js";
  10. import { initDicts } from "@/utils/init.js";
  11. const allColumns = [...TableColumns, ...SearchColumns];
  12. TabColumns.forEach(column =>{
  13. allColumns.push(...column.tableColumns)
  14. })
  15. export default {
  16. name: "PuchaseOrder",
  17. // dicts: initDicts(SelectColumns),
  18. dicts: [...initDicts(allColumns)],
  19. components: {
  20. AddDrawer: () => import('./add/index.vue'),
  21. SeeDrawer: () => import('./see/index.vue'),
  22. EditDrawer: () => import('./edit/index.vue'),
  23. PurchaseReturnDrawer: () => import('./purchaseReturn/index.vue'),
  24. ElSuperTable: () => import("@/components/super-table/index.vue"),
  25. ElSuperSearch: () => import("@/components/super-search/index.vue"),
  26. },
  27. data() {
  28. const initTabColumns = () => TabColumns;
  29. return {
  30. loading: false,
  31. tabLoading:false,
  32. isSimpleSearch: true,
  33. pageSizes: [10, 20, 50, 100],
  34. page: initPage(),
  35. searchColumns: SearchColumns,
  36. params: initParams(SearchColumns),
  37. tableColumns: TableColumns,
  38. tableData: [],
  39. tabColumns: initTabColumns(),
  40. tabName: "puOrderItemList",
  41. tabTableDatas: {
  42. puOrderItemList: [],
  43. puOrderExecuteList: [],
  44. },
  45. checkedList: [],
  46. // 子表Select
  47. checkedTabList: [],
  48. // 主表点击信息
  49. primaryResource:{},
  50. timer:300,
  51. timeOut:null,
  52. };
  53. },
  54. computed: {
  55. // showSearchColumns() {
  56. // return this.isSimpleSearch
  57. // ? this.searchColumns.slice(0, 4)
  58. // : this.searchColumns;
  59. // },
  60. // tableShowColumns:{
  61. // get() {
  62. // return this.tableColumns.filter(({ attr }) => attr.isHidden);
  63. // },
  64. // },
  65. $dicts: {
  66. get: function () {
  67. return this.dict.type;
  68. },
  69. },
  70. },
  71. created() {
  72. // this.fetchList(this.params, this.page);
  73. this.handleRefreshList();
  74. },
  75. methods: {
  76. async fetchList(data, params) {
  77. try {
  78. this.loading = true;
  79. params['isAsc'] = 'desc';
  80. params['orderByColumn'] = 'updateTime';
  81. const { code, msg, rows, total } = await orderApi.list(data, params);
  82. if (code === 200) {
  83. this.page.total = total;
  84. this.tableData = rows;
  85. }
  86. } catch (err) {
  87. //
  88. } finally {
  89. this.loading = false;
  90. for (const key in this.tabTableDatas) {
  91. this.tabTableDatas[key] = [];
  92. }
  93. }
  94. },
  95. handleSearchChange() {
  96. this.isSimpleSearch = !this.isSimpleSearch;
  97. },
  98. // 刷新操作
  99. handleRefreshList() {
  100. this.page = initPage();
  101. this.checkedList = [];
  102. this.checkedTabList = [];
  103. this.primaryResource = {};
  104. this.fetchList(this.params, this.page);
  105. },
  106. // 查询操作
  107. handleQueryList() {
  108. let {date} = this.params;
  109. this.params.startDate = date ? date[0] :'';
  110. this.params.endDate = date ? date[1] : '';
  111. this.fetchList(this.params, this.page);
  112. },
  113. // 重置操作
  114. handleResetList() {
  115. this.page = initPage();
  116. this.params = initParams(SearchColumns);
  117. this.fetchList(this.params, this.page);
  118. },
  119. handleTabClick() { },
  120. // 新增
  121. handleOpenAddDrawer(copyVal) {
  122. const { setVisible, setCopyParams } = this.$refs.addDrawerFef;
  123. setVisible(true,(copyVal.id && copyVal.id != '') ? true :false);
  124. copyVal.id && copyVal.id != '' && setCopyParams(copyVal.id);
  125. },
  126. // 复制
  127. handleCopy() {
  128. this.handleOpenAddDrawer(this.checkedList[0]);
  129. },
  130. // 查看
  131. async handleOpenSeeDrawer(row) {
  132. window.clearInterval(this.timeOut);
  133. const { id } = row;
  134. const { setVisible, fetchItem } = this.$refs.seeDrawerRef;
  135. await setVisible(true);
  136. await fetchItem(id);
  137. },
  138. // 编辑、修订
  139. async handleOpenEditDrawer(row) {
  140. const { id } = row;
  141. const { setVisible, fetchItem } = this.$refs.editDrawerRef;
  142. await setVisible(true);
  143. await fetchItem(id);
  144. },
  145. // 获取子表信息
  146. handleDetailsData(row) {
  147. window.clearTimeout(this.timeOut);
  148. this.timeOut = setTimeout(async () =>{
  149. try {
  150. this.tabLoading = true;
  151. this.primaryResource = row;
  152. this.checkedTabList = [];
  153. const { code, msg, data } = await orderApi.details(row.id);
  154. if (code === 200) {
  155. // 物料信息:puOrderItemList 执行结果:puOrderExecuteList
  156. for (const key in this.tabTableDatas) {
  157. this.tabTableDatas[key] = data[key];
  158. }
  159. }
  160. } catch (err) {}
  161. finally{
  162. this.tabLoading = false;
  163. }
  164. },this.timer)
  165. },
  166. // 操作提示弹窗
  167. handleConfirmTips(success){
  168. this.$confirm('是否继续此操作?', '提示', {
  169. confirmButtonText: '确定',
  170. cancelButtonText: '取消',
  171. type: 'warning'
  172. }).then(() => {
  173. success();
  174. }).catch(() => {
  175. this.$message({
  176. type: 'info',
  177. message: '已取消操作!'
  178. });
  179. });
  180. },
  181. // 删除操作
  182. handleDeleteList(row) {
  183. try {
  184. this.loading = true;
  185. this.handleConfirmTips(async()=>{
  186. const { id } = row;
  187. const { code } = await orderApi.remove(id);
  188. if (code === 200) {
  189. this.handleRefreshList();
  190. }
  191. })
  192. } catch (err) {
  193. //
  194. } finally {
  195. this.loading = false;
  196. }
  197. },
  198. // 批量提交
  199. handleBatchSubmit(){
  200. let inconformity = this.checkedList.filter(row => !((row.status == '0' || row.status == '3') && row.isEnd === 'N'));
  201. if(!inconformity.length && this.checkedList.length){
  202. let puOrderIds = this.checkedList.map( item => Number(item.id));
  203. this.fetchSubmit(puOrderIds);
  204. }else{
  205. this.$message({
  206. message: '当前选中存在不满足提交条件的数据!',
  207. type: 'warning'
  208. });
  209. }
  210. },
  211. // 提交
  212. handleSubmit(row) {
  213. let puOrderIds = [Number(row.id)];
  214. this.fetchSubmit(puOrderIds);
  215. },
  216. fetchSubmit(puOrderIds){
  217. try {
  218. this.handleConfirmTips(async()=>{
  219. let { code } = await orderApi.submit({ puOrderIds});
  220. if (code == 200) {
  221. this.handleRefreshList();
  222. }
  223. })
  224. } catch (error) {}
  225. },
  226. // 判断“整单退回”按钮
  227. judgeIsAllReturn() {
  228. if (this.checkedList.length == 1) {
  229. // 非手工、状态:自由/驳回
  230. if (this.judgeIsOption('return',this.checkedList[0])) {
  231. // if (this.checkedList[0].source != 3 &&
  232. // (this.checkedList[0].status == 0 || this.checkedList[0].status == 3)
  233. // ) {
  234. return false
  235. }
  236. }
  237. return true;
  238. },
  239. // 整单退回
  240. handleAllReturn() {
  241. this.handleReturn(this.checkedList[0].id,[]);
  242. },
  243. // 判断“行退回”按钮
  244. judgeIsLineReturn() {
  245. if (this.checkedTabList.length == 1) {
  246. // 主信息:非手工、状态:自由/驳回
  247. if(this.judgeIsOption('return',this.primaryResource)){
  248. // if(this.primaryResource.source != 3 &&
  249. // (this.primaryResource.status == 0 || this.primaryResource.status == 3) ){
  250. return false
  251. }
  252. }
  253. return true;
  254. },
  255. // 行退回
  256. handleLineReturn(){
  257. let ids = this.checkedTabList.map(checked => checked.id);
  258. console.log(ids,'行退回ids');
  259. this.handleReturn(this.primaryResource.id,ids);
  260. },
  261. // 退回接口
  262. handleReturn(id,documentIds){
  263. this.$prompt('请输入退回原因', '提示', {
  264. confirmButtonText: '确定',
  265. cancelButtonText: '取消',
  266. inputPattern: /\s*\S+?/,
  267. inputErrorMessage: '退回原因不能为空'
  268. }).then(async ({ value }) => {
  269. let data = {
  270. id:Number(id),
  271. documentIds:documentIds.map(ids =>Number(ids)),
  272. baskCause: value,
  273. };
  274. console.log(data);
  275. try {
  276. let { code, msg } = await orderApi.documentsReturn(data);
  277. if (code === 200) {
  278. this.handleRefreshList();
  279. }
  280. } catch (error) {
  281. console.log(error,'error------------');
  282. }
  283. }).catch(() => { });
  284. },
  285. // 判断是否满足整单关闭
  286. judgeIsAllClose() {
  287. if (this.checkedList.length == 1) {
  288. // if (this.checkedList[0].status == 0) {
  289. if (this.judgeIsOption('allClose',this.checkedList[0])) {
  290. // 未审批状态下整单关闭
  291. return false
  292. }
  293. }
  294. return true;
  295. },
  296. // 整单关闭
  297. handleAllClose() {
  298. // 未审批状态下整单关闭
  299. try {
  300. this.handleConfirmTips(async() =>{
  301. let puOrderIds = this.checkedList.map(order => Number(order.id));
  302. let { code } = await orderApi.close({ puOrderIds });
  303. if (code === 200) {
  304. this.handleRefreshList();
  305. }
  306. })
  307. } catch (error) { }
  308. },
  309. // 付款协议
  310. async handlePaymentRequest(){
  311. // name:工号
  312. try {
  313. let {code,msg} = await orderApi.payRequest();
  314. if(code == 200){
  315. msg.replace(/\/n/g,'');
  316. let url = `uclient://start/http://172.16.100.2:8081?ssoKey=${msg}&uiloader=nc.uap.lfw.applet.PortalUILoader&nodeId=40040407`
  317. window.location.href = url;
  318. }
  319. } catch (error) {}
  320. },
  321. // 退货
  322. async handlePurchaseReturn(){
  323. const { id } = this.checkedList[0];
  324. const { setVisible, fetchStorage } = this.$refs.PurchaseReturnDrawerRef;
  325. await setVisible(true);
  326. await fetchStorage(id);
  327. },
  328. // 主表Select框
  329. handleSelect(selection, row) {
  330. this.checkedList = selection;
  331. console.log(this.checkedList, 'this.checkedList');
  332. },
  333. // 子表Select框
  334. handleTabSelect(selection, row){
  335. this.checkedTabList = selection;
  336. console.log(this.checkedTabList, 'this.checkedTabList');
  337. },
  338. // 保留两位小数,补位
  339. keepTwoDecimalStr(num) {
  340. if(num){
  341. const result = Number(num.toString().match(/^\d+(?:\.\d{0,2})?/));
  342. let s = result.toString();
  343. let rs = s.indexOf('.');
  344. if (rs < 0) {
  345. rs = s.length;
  346. s += '.';
  347. }
  348. while (s.length <= rs + 2) {
  349. s += '0';
  350. }
  351. return s;
  352. }else{
  353. return '';
  354. }
  355. },
  356. judgeIsOption(type,source){
  357. switch(type){
  358. case 'edit':
  359. return (source.status == '0' || source.status == '3') && source.isEnd === 'N';
  360. case 'revise':
  361. return source.status == '2' && source.isEnd === 'N';
  362. case 'del':
  363. return (source.status == '0' || source.status == '3') && source.source == '3' && source.isEnd === 'N';
  364. case 'submit':
  365. return (source.status == '0' || source.status == '3') && source.isEnd === 'N';
  366. case 'allClose':
  367. return source.status == 0 && source.isEnd === 'N';
  368. case 'return':
  369. return source.source != 3 && source.isEnd === 'N' &&
  370. (source.status == 0 || source.status == 3);
  371. default:
  372. return false;
  373. }
  374. }
  375. }
  376. };
  377. </script>
  378. <template>
  379. <el-card
  380. v-loading="loading"
  381. style="width: calc(100% - 24px); height: 100%; margin: 10px;padding: 10px;"
  382. :body-style="{ padding: 0 }"
  383. >
  384. <SeeDrawer ref="seeDrawerRef"></SeeDrawer>
  385. <AddDrawer ref="addDrawerFef" @close="handleRefreshList"></AddDrawer>
  386. <EditDrawer ref="editDrawerRef" @close="handleRefreshList"></EditDrawer>
  387. <PurchaseReturnDrawer ref="PurchaseReturnDrawerRef" @close="handleRefreshList"></PurchaseReturnDrawer>
  388. <el-super-search
  389. v-model="params"
  390. :size="'mini'"
  391. :dict="dict"
  392. :columns="searchColumns"
  393. @reset="handleResetList"
  394. @submit="handleQueryList"
  395. ></el-super-search>
  396. <!-- 操作 -->
  397. <el-row :gutter="24" style="padding: 0 20px">
  398. <el-col :span="24" style="text-align: right;margin: 0 10px 0 0">
  399. <el-button size="mini" type="primary" @click="handleOpenAddDrawer"
  400. v-hasPermi="['material:order:add']">新增</el-button>
  401. <el-button-group style="margin-left: 10px">
  402. <el-button type="primary" size="mini" :disabled="checkedList.length != 1" @click="handleCopy">复制</el-button>
  403. <el-button type="primary" size="mini" @click="handleBatchSubmit">批量提交</el-button>
  404. </el-button-group>
  405. <el-button-group style="margin-left: 10px" :key="checkedList.length + 1">
  406. <el-button type="primary" size="mini" @click="handleAllReturn" :disabled="judgeIsAllReturn()">整单退回</el-button>
  407. <el-button type="primary" size="mini" @click="handleAllClose" :disabled="judgeIsAllClose()">整单关闭</el-button>
  408. </el-button-group>
  409. <el-button-group style="margin:0 10px">
  410. <!-- <el-button size="mini"
  411. :disabled="!(checkedList.length == 1 && checkedList[0].deliveryStatus == '0')"
  412. :key="checkedList.length"
  413. @click="handlePurchaseReturn"
  414. >采购退货</el-button> -->
  415. <el-button type="primary" size="mini" @click="handlePaymentRequest">付款申请</el-button>
  416. </el-button-group>
  417. </el-col>
  418. </el-row>
  419. <el-super-table
  420. v-model="tableData"
  421. size="mini"
  422. :dict="dict"
  423. :columns="tableColumns"
  424. hideOperationColumns
  425. stroage
  426. @row-dblclick="handleOpenSeeDrawer"
  427. @row-click="handleDetailsData"
  428. @select="handleSelect"
  429. >
  430. <el-table-column type="selection" width="45" ></el-table-column>
  431. <el-table-column type="index" width="50" label="序号"></el-table-column>
  432. <el-table-column fixed="right" label="操作" width="120">
  433. <template slot-scope="scope">
  434. <!-- <template #operation="{scope}"> -->
  435. <el-button
  436. v-if="judgeIsOption('revise',scope.row)"
  437. type="text"
  438. size="small"
  439. @click.stop="handleOpenEditDrawer(scope.row)"
  440. v-hasPermi="['material:order:edit']">
  441. 修订
  442. </el-button>
  443. <el-button
  444. v-if="judgeIsOption('edit',scope.row)"
  445. type="text"
  446. size="small"
  447. @click.stop="handleOpenEditDrawer(scope.row)"
  448. v-hasPermi="['material:order:edit']">
  449. 编辑
  450. </el-button>
  451. <!-- 0=自由态,1=审批中,2=已审核,3=已驳回 4=提交中-->
  452. <el-button
  453. v-if="judgeIsOption('del',scope.row)"
  454. type="text"
  455. size="small"
  456. @click.stop="handleDeleteList(scope.row)"
  457. v-hasPermi="['material:order:remove']"
  458. >删除</el-button>
  459. <el-button
  460. v-if="judgeIsOption('submit',scope.row)"
  461. type="text"
  462. size="mini"
  463. v-hasPermi="['material:order:toOa']"
  464. @click.stop="handleSubmit(scope.row)"
  465. >提交</el-button>
  466. </template>
  467. </el-table-column>
  468. </el-super-table>
  469. <pagination
  470. v-show="page.total>0"
  471. :total="page.total"
  472. :page.sync="page.pageNum"
  473. :limit.sync="page.pageSize"
  474. @pagination="fetchList(params, page)"
  475. />
  476. <div style="position: relative; padding-top: 10px;" v-loading="tabLoading">
  477. <el-row style="position: absolute; top: 30px; right: 20px;z-index: 10;">
  478. <el-button
  479. size="mini"
  480. @click="handleLineReturn"
  481. :disabled="judgeIsLineReturn()"
  482. >行退回</el-button>
  483. </el-row>
  484. <el-tabs v-model="tabName" @tab-click="handleTabClick" style="width: 100%;padding: 20px 10px">
  485. <el-tab-pane
  486. v-for="(column, index) in tabColumns"
  487. :key="index"
  488. :label="column.title"
  489. :name="column.key"
  490. >
  491. <el-super-table
  492. v-model="tabTableDatas[column.key]"
  493. size="mini"
  494. :dict="dict"
  495. hideOperationColumns
  496. stroage
  497. :columns="column.tableColumns"
  498. @select="handleTabSelect"
  499. >
  500. <el-table-column
  501. v-if=" tabName === 'puOrderItemList'"
  502. type="selection"
  503. width="45"
  504. ></el-table-column>
  505. <el-table-column type="index" width="50" label="序号"></el-table-column>
  506. </el-super-table>
  507. </el-tab-pane>
  508. </el-tabs>
  509. </div>
  510. </el-card>
  511. </template>