index.vue 8.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298
  1. <script>
  2. import { LIST } from "@/api/business/purchase/apply";
  3. import { FormColumns, SearchColumns } from "./column";
  4. import { initPage, initDicts, initParams } from "@/utils/init";
  5. export default {
  6. name: "PuchaseApply",
  7. dicts: [...initDicts(SearchColumns), ...initDicts(FormColumns)],
  8. components: {
  9. AddModel: () => import("./add/index.vue"),
  10. SeeModel: () => import("./see/index.vue"),
  11. EditModel: () => import("./edit/index.vue"),
  12. SubmitModel: () => import("./submit/index.vue"),
  13. DeleteModel: () => import("./delete/index.vue"),
  14. },
  15. data() {
  16. return {
  17. size: "mini",
  18. loading: false,
  19. searchColumns: SearchColumns,
  20. params: initParams(SearchColumns),
  21. tableData: [],
  22. selectData: [],
  23. tableColumns: FormColumns,
  24. page: { pageNum: 1, pageSize: 10, total: 0 },
  25. };
  26. },
  27. computed: {},
  28. created() {
  29. this.params.status = "0";
  30. this.useQuery(this.params, this.page);
  31. },
  32. methods: {
  33. //
  34. setSelectable(row) {
  35. const { status } = row;
  36. // 审批中
  37. if (status === "1") return false;
  38. // 已完成
  39. else if (status === "2") return false;
  40. // other
  41. else return true;
  42. },
  43. //
  44. async fetchList(prop, page) {
  45. try {
  46. this.loading = true;
  47. const { pageNum, pageSize } = page;
  48. const { code, rows, total } = await LIST(
  49. { ...prop },
  50. { pageNum, pageSize }
  51. );
  52. if (code === 200) {
  53. this.tableData = rows;
  54. this.page.total = total;
  55. }
  56. } catch (err) {
  57. // catch
  58. console.error(err);
  59. } finally {
  60. // finally
  61. this.loading = false;
  62. }
  63. },
  64. // 查 询
  65. useQuery(prop, page) {
  66. this.selectData = [];
  67. this.fetchList(prop, page);
  68. },
  69. // 重 置
  70. useReset() {
  71. this.page = initPage();
  72. this.params = initParams(SearchColumns);
  73. this.useQuery(this.params, this.page);
  74. },
  75. // 选 择
  76. useSelect(prop) {
  77. this.selectData = prop;
  78. },
  79. // 新 增
  80. async useAdd() {
  81. const { open } = this.$refs.AddModel;
  82. await open();
  83. },
  84. // 复 制
  85. async useCopy(prop) {
  86. const [{ id }] = prop;
  87. const { open } = this.$refs.AddModel;
  88. await open(id);
  89. },
  90. hasPowerCopy(prop) {
  91. return prop.length === 1;
  92. },
  93. // 删 除
  94. async useDelete(prop) {
  95. const { open } = this.$refs.DeleteModel;
  96. await open(prop);
  97. },
  98. hasPowerDelete(prop) {
  99. if (prop.length === 1) {
  100. const [{ status }] = prop;
  101. if (status === "1") return false;
  102. else if (status === "2") return false;
  103. else return true;
  104. } else {
  105. return !!prop.length;
  106. }
  107. },
  108. // 编 辑
  109. async useEdit(prop) {
  110. const [{ id }] = prop;
  111. const { open } = this.$refs.EditModel;
  112. await open(id);
  113. },
  114. hasPowerEdit(prop) {
  115. if (prop.length === 1) {
  116. const [{ status }] = prop;
  117. if (status === "1") return false;
  118. else if (status === "2") return false;
  119. else return true;
  120. } else {
  121. return !!prop.length;
  122. }
  123. },
  124. // 明 细
  125. async useSee(prop) {
  126. const { id } = prop;
  127. const { open } = this.$refs.SeeModel;
  128. await open(id);
  129. },
  130. // 审 核
  131. async useSubmit(prop, done) {
  132. const { open } = this.$refs.SubmitModel;
  133. await open(prop, done);
  134. },
  135. hasPowerSubmit(prop) {
  136. if (prop.length === 1) {
  137. const [{ status }] = prop;
  138. if (status === "1") return false;
  139. else if (status === "2") return false;
  140. else return true;
  141. } else {
  142. return !!prop.length;
  143. }
  144. },
  145. },
  146. };
  147. </script>
  148. <template>
  149. <el-card
  150. v-loading="loading"
  151. style="
  152. width: calc(100% - 20px);
  153. height: 100%;
  154. margin: 10px;
  155. padding: 0 20px 20px 0;
  156. "
  157. :body-style="{ padding: 0 }"
  158. >
  159. <see-model ref="SeeModel"></see-model>
  160. <add-model ref="AddModel" @success="useReset"></add-model>
  161. <edit-model ref="EditModel" @success="useQuery(params, page)"></edit-model>
  162. <submit-model
  163. ref="SubmitModel"
  164. @success="useQuery(params, page)"
  165. ></submit-model>
  166. <delete-model
  167. ref="DeleteModel"
  168. @success="useQuery(params, page)"
  169. ></delete-model>
  170. <el-form
  171. :size="size"
  172. :model="params"
  173. label-width="auto"
  174. label-position="right"
  175. style="padding: 20px 20px 0"
  176. >
  177. <el-row :gutter="20" style="display: flex; flex-wrap: wrap">
  178. <el-col
  179. v-for="column in searchColumns"
  180. :key="column.title"
  181. :span="column.span || 6"
  182. >
  183. <el-form-item :prop="column.key" :label="column.title">
  184. <el-input
  185. v-if="column.inputType === 'Input'"
  186. v-model="params[column.key]"
  187. :placeholder="column.placeholder"
  188. style="width: 100%"
  189. @keyup.enter.native="useQuery(params, page)"
  190. ></el-input>
  191. <el-select
  192. v-if="column.inputType === 'Select'"
  193. v-model="params[column.key]"
  194. :disabled="column.disabled"
  195. :clearable="column.clearable"
  196. :placeholder="column.placeholder"
  197. style="width: 100%"
  198. @change="useQuery(params, page)"
  199. @keyup.enter.native="useQuery(params, page)"
  200. >
  201. <el-option
  202. v-for="item in dict.type[column.referName]"
  203. :key="item.value"
  204. :label="item.label"
  205. :value="item.value"
  206. >
  207. </el-option>
  208. </el-select>
  209. <dr-popover-select
  210. v-if="column.inputType === 'PopoverSelect'"
  211. v-model="params[column.key]"
  212. :size="size"
  213. :source.sync="params"
  214. :title="column.title"
  215. :type="column.referName"
  216. :multiple="column.multiple"
  217. :readonly="column.readonly"
  218. :value-key="column.valueKey"
  219. :placeholder="column.placeholder"
  220. :data-mapping="column.dataMapping"
  221. @change="useQuery(params, page)"
  222. @keyup.enter.native="useQuery(params, page)"
  223. >
  224. </dr-popover-select>
  225. </el-form-item>
  226. </el-col>
  227. </el-row>
  228. </el-form>
  229. <el-row style="padding: 0 20px">
  230. <el-button :size="size" @click="useQuery(params, page)">
  231. 查 询
  232. </el-button>
  233. <el-button :size="size" @click="useReset"> 重 置 </el-button>
  234. <el-button :size="size" @click="useAdd"> 新 增 </el-button>
  235. <el-button
  236. v-show="hasPowerCopy(selectData)"
  237. :size="size"
  238. @click="useCopy(selectData)"
  239. >
  240. 复 制
  241. </el-button>
  242. <el-button
  243. v-show="hasPowerDelete(selectData)"
  244. :size="size"
  245. @click="useDelete(selectData)"
  246. >
  247. 删 除
  248. </el-button>
  249. </el-row>
  250. <el-table
  251. :size="size"
  252. :data="tableData"
  253. highlight-current-row
  254. @row-click="useSelect([$event])"
  255. @row-dblclick="useSee"
  256. @selection-change="useSelect"
  257. style="width: 100%; margin: 20px 0 0 0"
  258. >
  259. <el-table-column
  260. fixed
  261. width="55"
  262. align="center"
  263. type="selection"
  264. :selectable="setSelectable"
  265. >
  266. </el-table-column>
  267. <el-table-column
  268. v-for="(column, index) in tableColumns"
  269. :key="index"
  270. :prop="column.key"
  271. :label="column.title"
  272. :width="column.width || 200"
  273. show-overflow-tooltip
  274. >
  275. <template slot-scope="scope">
  276. <dict-tag
  277. v-if="column.inputType === 'Select'"
  278. :size="size"
  279. :value="scope.row[column.key]"
  280. :options="dict.type[column.referName]"
  281. />
  282. <dr-file-preview
  283. v-else-if="column.inputType === 'Upload'"
  284. v-model="scope.row[column.key]"
  285. ></dr-file-preview>
  286. <span v-else>{{ scope.row[column.key] }}</span>
  287. </template>
  288. </el-table-column>
  289. </el-table>
  290. <pagination
  291. :total="page.total"
  292. :page.sync="page.pageNum"
  293. :limit.sync="page.pageSize"
  294. @pagination="useQuery(params, page)"
  295. />
  296. </el-card>
  297. </template>