index.vue 9.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298
  1. <script>
  2. import { TableColumns, SearchColumns } from "./column";
  3. import { LIST, SHUTDOWN, EXPORT } from "@/api/business/purchase/task";
  4. import {
  5. initPage,
  6. initLayout,
  7. initPageSizes,
  8. initParams,
  9. initDicts,
  10. } from "@/utils/init";
  11. export default {
  12. name: "PuchaseTask",
  13. dicts: initDicts(TableColumns),
  14. components: {
  15. SeeDialog: () => import("./see/index.vue"),
  16. FirstDirectDialog: () => import("./first-direct/index.vue"),
  17. DocReturnDialog: () => import("./documents-return/index.vue"),
  18. ModifyBuyerDialog: () => import("./modify-buyer/index.vue"),
  19. },
  20. data() {
  21. return {
  22. size: "mini",
  23. loading: false,
  24. searchColumns: SearchColumns,
  25. params: initParams(SearchColumns),
  26. tableData: [],
  27. selectData: [],
  28. tableColumns: TableColumns,
  29. page: initPage(),
  30. layout: initLayout(),
  31. pageSizes: initPageSizes(),
  32. };
  33. },
  34. computed: {},
  35. watch: {},
  36. created() {
  37. this.handleQueryList(this.params, this.page);
  38. },
  39. methods: {
  40. //
  41. async fetchList(prop, page) {
  42. try {
  43. this.loading = true;
  44. const { pageNum, pageSize } = page;
  45. const { code, msg, rows, total } = await LIST(
  46. { ...prop },
  47. { pageNum, pageSize, isAsc: "desc", orderByColumn: "createTime" }
  48. );
  49. if (code === 200) {
  50. this.tableData = rows;
  51. this.page.total = total;
  52. this.$notify.success({ title: msg });
  53. } else {
  54. this.$notify.warning({ title: msg });
  55. }
  56. } catch (err) {
  57. //
  58. } finally {
  59. this.loading = false;
  60. }
  61. },
  62. // 查询操作
  63. handleQueryList(prop, page) {
  64. const { date } = prop;
  65. prop.endDate = date[1];
  66. prop.startDate = date[0];
  67. this.fetchList({ ...prop, date: undefined }, page);
  68. },
  69. // 重置操作
  70. handleResetList() {
  71. this.page = initPage();
  72. this.params = initParams(SearchColumns);
  73. this.handleQueryList(this.params, this.page);
  74. },
  75. // 页大小变
  76. handleSizeChange(prop) {
  77. this.page.pageSize = prop;
  78. this.handleQueryList(this.params, this.page);
  79. },
  80. // 当前页变
  81. handleCurrentChange(prop) {
  82. this.page.pageNum = prop;
  83. this.handleQueryList(this.params, this.page);
  84. },
  85. // 选择行
  86. handleSelectionChange(prop) {
  87. this.selectData = prop;
  88. },
  89. // 行关闭
  90. async handleShutDown(prop) {
  91. try {
  92. this.loading = true;
  93. const { demandItemId } = prop;
  94. const { code, msg } = await SHUTDOWN(demandItemId);
  95. if (code === 200) {
  96. this.$notify.success({ title: msg });
  97. await this.handleQueryList(this.params, this.page);
  98. } else {
  99. this.$notify.warning({ title: msg });
  100. }
  101. } catch (err) {
  102. //
  103. } finally {
  104. this.loading = false;
  105. }
  106. },
  107. // 退回需求
  108. async handleDocumentsReturn(prop) {
  109. const { setVisible, beforeOpenDoSome } = this.$refs.DocReturnDialog;
  110. await setVisible(true);
  111. await beforeOpenDoSome(prop);
  112. },
  113. // 转派
  114. async handleModifyBuyer(prop) {
  115. const { id } = prop;
  116. const { setVisible, beforeOpenDoSome } = this.$refs.ModifyBuyerDialog;
  117. await setVisible(true);
  118. await beforeOpenDoSome(id);
  119. },
  120. // 导出
  121. async handleExport(prop, page) {
  122. const { pageNum, pageSize } = page;
  123. this.download(
  124. "pu/order/generate/export",
  125. { ...prop, pageNum, pageSize },
  126. `KONG_${new Date().getTime()}.xlsx`
  127. );
  128. },
  129. // 打开查看drawer
  130. async handleOpenSeeDrawer(prop) {
  131. const { id } = prop;
  132. const { setVisible, beforeOpenDoSome } = this.$refs.SeeDialog;
  133. await setVisible(true);
  134. await beforeOpenDoSome(id);
  135. },
  136. // 打开首次直采drawer
  137. async handleOpenFristDirectDrawer(prop) {
  138. const { setVisible, beforeOpenDoSome } = this.$refs.FirstDirectDialog;
  139. await setVisible(true);
  140. await beforeOpenDoSome(prop);
  141. },
  142. },
  143. };
  144. </script>
  145. <template>
  146. <el-card v-loading="loading" style="width: calc(100% - 24px); height: 100%; margin: 10px" :body-style="{ padding: 0 }">
  147. <see-dialog ref="SeeDialog"></see-dialog>
  148. <first-direct-dialog ref="FirstDirectDialog"></first-direct-dialog>
  149. <doc-return-dialog ref="DocReturnDialog"></doc-return-dialog>
  150. <modify-buyer-dialog ref="ModifyBuyerDialog"></modify-buyer-dialog>
  151. <el-form
  152. :size="size"
  153. :inline="true"
  154. :model="params"
  155. label-width="75px"
  156. label-position="right"
  157. style="padding: 20px 20px 0"
  158. >
  159. <el-form-item
  160. v-for="column in searchColumns"
  161. :key="column.title"
  162. :prop="column.key"
  163. :label="column.title"
  164. >
  165. <el-input
  166. v-if="column.inputType === 'Input'"
  167. v-model="params[column.key]"
  168. :disabled="column.disabled"
  169. :clearable="column.clearable"
  170. :placeholder="column.placeholder"
  171. style="width: 100%"
  172. ></el-input>
  173. <el-select
  174. v-if="column.inputType === 'Select'"
  175. v-model="params[column.key]"
  176. :disabled="column.disabled"
  177. :clearable="column.clearable"
  178. :placeholder="column.placeholder"
  179. style="width: 100%"
  180. >
  181. <el-option
  182. v-for="item in dict.type[column.referName]"
  183. :key="item.value"
  184. :label="item.label"
  185. :value="item.value"
  186. >
  187. </el-option>
  188. </el-select>
  189. <el-date-picker
  190. v-if="column.inputType === 'DatePicker'"
  191. v-model="params[column.key]"
  192. :type="column.type"
  193. :placeholder="column.placeholder"
  194. :value-format="column.valueFormat"
  195. :unlink-panels="column.unlinkPanels"
  196. :picker-options="column.pickerOptions"
  197. :range-separator="column.rangeSeparator"
  198. :end-placeholder="column.endPlaceholder"
  199. :start-placeholder="column.startPlaceholder"
  200. style="width: 100%"
  201. >
  202. </el-date-picker>
  203. <dr-popover-select
  204. v-if="column.inputType === 'PopoverSelect'"
  205. v-model="params[column.key]"
  206. :size="size"
  207. :source.sync="params"
  208. :title="column.title"
  209. :type="column.referName"
  210. :multiple="column.multiple"
  211. :readonly="column.readonly"
  212. :value-key="column.valueKey"
  213. :placeholder="column.placeholder"
  214. :data-mapping="column.dataMapping"
  215. :query-params="column.queryParams(params)"
  216. >
  217. </dr-popover-select>
  218. <dr-popover-tree-select
  219. v-if="column.inputType === 'PopoverTreeSelect'"
  220. v-model="params[column.key]"
  221. :source.sync="params"
  222. :title="column.title"
  223. :type="column.referName"
  224. :multiple="column.multiple"
  225. :show-key="column.showKey"
  226. :value-key="column.valueKey"
  227. :placeholder="column.placeholder"
  228. :data-mapping="column.dataMapping"
  229. :query-params="column.queryParams(params)"
  230. >
  231. </dr-popover-tree-select>
  232. </el-form-item>
  233. <el-form-item>
  234. <el-button
  235. circle
  236. :size="size"
  237. icon="el-icon-search"
  238. @click="handleQueryList(params, page)"
  239. ></el-button>
  240. <el-button
  241. circle
  242. :size="size"
  243. icon="el-icon-refresh"
  244. @click="handleResetList"
  245. ></el-button>
  246. </el-form-item>
  247. </el-form>
  248. <el-row :gutter="24" style="padding: 0 20px">
  249. <el-col :span="24">
  250. <el-button :size="size" @click="handleExport(params, page)">
  251. 导 出
  252. </el-button>
  253. <el-button :size="size" :disabled="selectData.length !== 1" @click="handleModifyBuyer(selectData[0])">
  254. 转 派
  255. </el-button>
  256. <el-button
  257. :size="size"
  258. :disabled="!selectData.length"
  259. @click="handleDocumentsReturn(selectData)"
  260. >
  261. 退回需求
  262. </el-button>
  263. <!-- <el-button
  264. :size="size"
  265. :disabled="selectData.length !== 1"
  266. @click="handleShutDown(selectData[0])"
  267. >
  268. 行关闭
  269. </el-button> -->
  270. <el-button :size="size" :disabled="!selectData.length" @click="handleOpenFristDirectDrawer(selectData)">
  271. 协议直采
  272. </el-button>
  273. </el-col>
  274. </el-row>
  275. <el-table :data="tableData" size="mini" style="width: 100%; margin: 20px 0 0 0" @row-dblclick="handleOpenSeeDrawer"
  276. @selection-change="handleSelectionChange">
  277. <el-table-column fixed width="55" align="center" type="selection">
  278. </el-table-column>
  279. <el-table-column v-for="(column, index) in tableColumns" :key="index" :prop="column.key" :label="column.title"
  280. :width="column.width || 180" :show-overflow-tooltip="column.showOverflowTooltip || true">
  281. <template slot-scope="scope">
  282. <dict-tag v-if="column.referName" :size="size" :value="scope.row[column.key]"
  283. :options="dict.type[column.referName]" />
  284. <span v-else>{{ scope.row[column.key] }}</span>
  285. </template>
  286. </el-table-column>
  287. </el-table>
  288. <el-pagination @size-change="handleSizeChange" @current-change="handleCurrentChange" :total="page.total"
  289. :page-sizes="pageSizes" :page-size="page.pageSize" :current-page="page.pageNum" hide-on-single-page
  290. layout="total, prev, pager, next, sizes, jumper">
  291. </el-pagination>
  292. </el-card>
  293. </template>