index.vue 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392
  1. <script>
  2. import { TableColumns, FormColumns } from "./column";
  3. import { LIST } from "@/api/business/purchase/contract";
  4. import { initDicts, initParams } from "@/utils/init.js";
  5. export default {
  6. name: "PuchaseContract",
  7. dicts: [...initDicts(FormColumns), ...initDicts(TableColumns)],
  8. components: {
  9. AddModel: () => import("./add/index.vue"),
  10. SeeModel: () => import("./see/index.vue"),
  11. EditModel: () => import("./edit/index.vue"),
  12. ExportModel: () => import("./export/index.vue"),
  13. // ImportModel: () => import("./import/index.vue"),
  14. DeleteModel: () => import("./delete/index.vue"),
  15. TerminationModel: () => import("./termination/index.vue"),
  16. PigeonholeModel: () => import("./pigeonhole/index.vue"),
  17. SubmitModel: () => import("./submit/index.vue"),
  18. ElDictTag: () => import("@/components/DictTag/index.vue"),
  19. ElFilePreview: () => import("@/components/file-preview/index.vue"),
  20. ElComputedInputV2: () => import("@/components/computed-input-v2/index.vue"),
  21. },
  22. data() {
  23. return {
  24. size: "mini",
  25. loading: false,
  26. batching: false,
  27. FormColumns: FormColumns,
  28. params: initParams(FormColumns),
  29. tableData: [],
  30. selectData: [],
  31. TableColumns: TableColumns,
  32. page: { pageNum: 1, pageSize: 10, total: 0 },
  33. };
  34. },
  35. computed: {
  36. $dicts: {
  37. get: function () {
  38. return this.dict.type;
  39. },
  40. },
  41. $power: {
  42. get() {
  43. const {
  44. selectData,
  45. selectData: [{ status, pigeonhole } = {}],
  46. } = this;
  47. const rule1 = selectData.length === 1;
  48. const rule2 = selectData.length > 1;
  49. const rule3 = status === "0" || status === "3";
  50. const rule4 = status === "2";
  51. const rule5 = pigeonhole === "Y";
  52. return {
  53. // 修 改
  54. edit: rule1 && !rule4,
  55. // 删 除
  56. delt: rule1 && rule3,
  57. // 终 止
  58. term: rule1 && rule4,
  59. // 归 档
  60. pige: rule1 && !rule5,
  61. // 提 交
  62. subm: rule1,
  63. };
  64. },
  65. },
  66. },
  67. created() {
  68. this.useQuery(this.params, this.page);
  69. },
  70. methods: {
  71. //
  72. async fetchList(prop, page) {
  73. try {
  74. // try
  75. this.loading = true;
  76. const { pageNum, pageSize } = page;
  77. const { code, rows, total } = await LIST({
  78. pageNum,
  79. pageSize,
  80. ...prop,
  81. });
  82. if (code === 200) {
  83. this.tableData = rows.map((item, index) => ({
  84. ...item,
  85. $index: (pageNum - 1) * pageSize + index + 1,
  86. }));
  87. this.page.total = total;
  88. }
  89. } catch (err) {
  90. // catch
  91. console.error(err);
  92. } finally {
  93. // finally
  94. this.loading = false;
  95. }
  96. },
  97. // 查 询
  98. useQuery(prop, page) {
  99. this.selectData = [];
  100. this.fetchList(prop, page);
  101. },
  102. // 重 置
  103. useReset() {
  104. this.page.pageNum = 1;
  105. this.page.pageSize = 10;
  106. this.params = initParams(FormColumns);
  107. this.useQuery(this.params, this.page);
  108. },
  109. // 选 择
  110. useRowClick(prop) {
  111. if (!this.batching) this.selectData = prop;
  112. },
  113. // 选 择
  114. useSelect(prop) {
  115. if (this.batching) this.selectData = prop;
  116. },
  117. // 批 量
  118. useBatch() {
  119. this.selectData = [];
  120. this.batching = !this.batching;
  121. },
  122. // 新 增
  123. async useAdd(prop) {
  124. const { open } = this.$refs.AddModel;
  125. await open(prop);
  126. },
  127. // 删 除
  128. async useDelete(prop) {
  129. const [{ id }] = prop;
  130. const { open } = this.$refs.DeleteModel;
  131. await open(id);
  132. },
  133. // 编 辑
  134. async useEdit(prop) {
  135. const [{ id }] = prop;
  136. const { open } = this.$refs.EditModel;
  137. await open(id);
  138. },
  139. // 明 细
  140. async useSee(prop) {
  141. const { id } = prop;
  142. const { open } = this.$refs.SeeModel;
  143. await open(id);
  144. },
  145. // 终 止
  146. async useTermination(prop) {
  147. const [{ id }] = prop;
  148. const { open } = this.$refs.TerminationModel;
  149. await open(id);
  150. },
  151. // 归 档
  152. async usePigeonhole(prop) {
  153. const [{ id }] = prop;
  154. const { open } = this.$refs.PigeonholeModel;
  155. await open(id);
  156. },
  157. // 导 出
  158. async useExport(prop, page) {
  159. const { pageNum, pageSize } = page;
  160. const { open } = this.$refs.ExportModel;
  161. await open({ ...prop, pageNum, pageSize });
  162. },
  163. // 导 入
  164. // async useImport() {
  165. // const { open } = this.$refs.ImportModel;
  166. // await open();
  167. // },
  168. // 提交OA
  169. async useSubmit(prop) {
  170. const [{ id }] = prop;
  171. const { open } = this.$refs.SubmitModel;
  172. await open(id);
  173. },
  174. },
  175. };
  176. </script>
  177. <template>
  178. <el-card v-loading="loading" :body-style="{ padding: 0 }">
  179. <see-model ref="SeeModel"></see-model>
  180. <add-model ref="AddModel" @success="useReset"></add-model>
  181. <edit-model ref="EditModel" @success="useQuery(params, page)"></edit-model>
  182. <export-model ref="ExportModel"></export-model>
  183. <!-- <import-model ref="ImportModel"></import-model> -->
  184. <submit-model
  185. ref="SubmitModel"
  186. @success="useQuery(params, page)"
  187. ></submit-model>
  188. <delete-model
  189. ref="DeleteModel"
  190. @success="useQuery(params, page)"
  191. ></delete-model>
  192. <termination-model
  193. ref="TerminationModel"
  194. @success="useQuery(params, page)"
  195. ></termination-model>
  196. <pigeonhole-model
  197. ref="PigeonholeModel"
  198. @success="useQuery(params, page)"
  199. ></pigeonhole-model>
  200. <el-form
  201. :size="size"
  202. :model="params"
  203. label-width="auto"
  204. label-position="right"
  205. @submit.native.prevent
  206. >
  207. <el-row :gutter="20" style="display: flex; flex-wrap: wrap">
  208. <el-col
  209. v-for="{ item, attr } in FormColumns"
  210. :key="item.key"
  211. :span="item.span || 6"
  212. >
  213. <el-form-item :prop="item.key" :label="item.title">
  214. <component
  215. v-if="attr.is === 'el-input'"
  216. v-bind="attr"
  217. v-model="params[item.key]"
  218. @keyup.enter.native="useQuery(params, page)"
  219. ></component>
  220. <component
  221. v-if="attr.is === 'el-select'"
  222. v-bind="attr"
  223. v-model="params[item.key]"
  224. style="width: 100%"
  225. @change="useQuery(params, page)"
  226. @keyup.enter.native="useQuery(params, page)"
  227. >
  228. <el-option
  229. v-for="option in $dicts[attr.dictName]"
  230. :key="option.value"
  231. :label="option.label"
  232. :value="option.value"
  233. >
  234. </el-option>
  235. </component>
  236. </el-form-item>
  237. </el-col>
  238. </el-row>
  239. </el-form>
  240. <div style="padding: 0 20px; display: flex; justify-content: space-between">
  241. <div>
  242. <el-button :size="size" @click="useQuery(params, page)">
  243. 查 询
  244. </el-button>
  245. <el-button :size="size" @click="useReset"> 重 置 </el-button>
  246. <el-button :size="size" @click="useAdd('add')"> 新 增 </el-button>
  247. <el-button :size="size" @click="useAdd('record')"> 期初补录 </el-button>
  248. <el-button :size="size" @click="useExport(params, page)">
  249. 导 出
  250. </el-button>
  251. <el-button
  252. v-show="$power.edit"
  253. :size="size"
  254. @click="useEdit(selectData)"
  255. >
  256. 编 辑
  257. </el-button>
  258. <el-button
  259. :size="size"
  260. v-show="$power.subm"
  261. @click="useSubmit(selectData)"
  262. >
  263. 提交OA
  264. </el-button>
  265. <el-button
  266. v-show="$power.delt"
  267. :size="size"
  268. @click="useDelete(selectData)"
  269. >
  270. 删 除
  271. </el-button>
  272. <el-button
  273. v-show="$power.term"
  274. :size="size"
  275. @click="useTermination(selectData)"
  276. >
  277. 终 止
  278. </el-button>
  279. <el-button
  280. v-show="$power.pige"
  281. :size="size"
  282. @click="usePigeonhole(selectData)"
  283. >
  284. 归 档
  285. </el-button>
  286. </div>
  287. <!-- <el-button :size="size" @click="useImport"> 导 入 </el-button> -->
  288. <div>
  289. <el-button
  290. :size="size"
  291. :icon="batching ? 'el-icon-close' : 'el-icon-check'"
  292. @click="useBatch"
  293. >
  294. 批 量
  295. </el-button>
  296. </div>
  297. </div>
  298. <el-table
  299. v-if="tableData.length"
  300. :size="size"
  301. :data="tableData"
  302. border
  303. stripe
  304. highlight-current-row
  305. @row-dblclick="useSee"
  306. @selection-change="useSelect"
  307. @row-click="useRowClick([$event])"
  308. >
  309. <el-table-column
  310. v-if="batching"
  311. fixed
  312. width="55"
  313. align="center"
  314. type="selection"
  315. :selectable="setSelectable"
  316. >
  317. </el-table-column>
  318. <el-table-column width="55" align="center" type="index">
  319. <template slot-scope="scope">
  320. {{ scope.row.$index }}
  321. </template>
  322. </el-table-column>
  323. <el-table-column
  324. v-for="{ item, attr } in TableColumns"
  325. :key="item.key"
  326. :prop="item.key"
  327. :label="item.title"
  328. :width="item.width || 200"
  329. show-overflow-tooltip
  330. >
  331. <template slot-scope="scope">
  332. <component
  333. v-if="attr.is === 'el-dict-tag'"
  334. v-bind="attr"
  335. v-model="scope.row[item.key]"
  336. :size="size"
  337. :options="dict.type[attr.dictName]"
  338. ></component>
  339. <component
  340. v-else-if="attr.is === 'el-file-preview'"
  341. v-bind="attr"
  342. v-model="scope.row[item.key]"
  343. ></component>
  344. <component
  345. v-else-if="attr.is === 'el-computed-input-v2'"
  346. v-bind="attr"
  347. v-model="scope.row[item.key]"
  348. ></component>
  349. <component is="span" v-else>{{
  350. scope.row[item.key] || "--"
  351. }}</component>
  352. </template>
  353. </el-table-column>
  354. </el-table>
  355. <el-empty v-else :image-size="200"></el-empty>
  356. <pagination
  357. :total="page.total"
  358. :page.sync="page.pageNum"
  359. :limit.sync="page.pageSize"
  360. @pagination="useQuery(params, page)"
  361. />
  362. </el-card>
  363. </template>
  364. <style scoped lang="scss">
  365. .el-card {
  366. width: calc(100% - 20px);
  367. height: 100%;
  368. margin: 10px;
  369. padding: 0 0 20px 0;
  370. .el-form {
  371. padding: 20px 0 0;
  372. }
  373. .el-row {
  374. display: flex;
  375. flex-wrap: wrap;
  376. padding: 0 20px;
  377. }
  378. ::v-deep .el-table--mini {
  379. width: 100%;
  380. margin: 20px 0 0 0;
  381. .el-table__cell {
  382. height: 50px;
  383. }
  384. td.el-table__cell {
  385. border-right: 0;
  386. // border-bottom: 0;
  387. }
  388. }
  389. }
  390. </style>