index.vue 10 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306
  1. <script>
  2. import Column from "../add/column";
  3. import useData from "../hooks/data";
  4. import useDicts from "../hooks/dicts";
  5. import useTable from "../hooks/table-function";
  6. import useWatch from "../hooks/watch";
  7. import useMethods from "../hooks/function";
  8. const { watchContractType } = useWatch();
  9. export default {
  10. name: "RecordDrawer",
  11. dicts: useDicts(Column),
  12. components: {},
  13. data() {
  14. return {
  15. title: "期 初 补 录",
  16. ...useData(Column),
  17. };
  18. },
  19. computed: {},
  20. watch: {
  21. "params.contractType": watchContractType(),
  22. },
  23. methods: {
  24. //
  25. async fetchRefer(prop, type, source) {
  26. const { fetchRefer } = useMethods();
  27. await fetchRefer({ _this: this, prop, type, source });
  28. },
  29. //
  30. async open() {
  31. const { open, fetchCode } = useMethods();
  32. await open({ _this: this });
  33. await fetchCode({ _this: this });
  34. const {
  35. user: {
  36. deptId: puDept,
  37. deptName: puDeptName,
  38. name: buyer,
  39. nickName: buyerName,
  40. orgId: puOrg,
  41. orgName: puOrgName,
  42. },
  43. } = this.$store.state;
  44. this.params.puOrg = puOrg;
  45. this.params.puOrgName = puOrgName;
  46. this.params.buyer = buyer;
  47. this.params.buyerName = buyerName;
  48. this.params.puDept = puDept;
  49. this.params.puDeptName = puDeptName;
  50. this.params.source = "期初补录";
  51. },
  52. //
  53. async hide() {
  54. const { hide } = useMethods();
  55. await hide({ _this: this });
  56. },
  57. //
  58. async useRowAdd(prop) {
  59. const { add } = useTable();
  60. await add({ _this: this, prop });
  61. },
  62. //
  63. async useRowRemove(prop, scope) {
  64. const { remove } = useTable();
  65. await remove({ _this: this, prop, scope });
  66. },
  67. //
  68. async useSubmit(prop) {
  69. const { submit } = useMethods();
  70. await submit({ _this: this, prop, type: "ADD" });
  71. },
  72. },
  73. created() {},
  74. mounted() {},
  75. destroyed() {},
  76. };
  77. </script>
  78. <template>
  79. <el-drawer
  80. :size="width"
  81. :title="title"
  82. :show-close="false"
  83. :visible.sync="visible"
  84. >
  85. <template slot="title">
  86. <span>{{ title }}</span>
  87. <span>
  88. <el-button
  89. :size="size"
  90. circle
  91. icon="el-icon-close"
  92. @click="hide"
  93. ></el-button>
  94. <el-button
  95. :size="size"
  96. circle
  97. icon="el-icon-check"
  98. @click="useSubmit('ruleForm')"
  99. >
  100. </el-button>
  101. </span>
  102. </template>
  103. <el-form
  104. ref="ruleForm"
  105. v-loading="loading"
  106. :size="size"
  107. :rules="rules"
  108. :model="params"
  109. label-width="auto"
  110. label-position="right"
  111. style="padding: 10px"
  112. >
  113. <el-row :gutter="20" style="display: flex; flex-wrap: wrap">
  114. <el-col
  115. v-for="(column, index) in formColumns"
  116. :key="index"
  117. :span="column.span || 6"
  118. >
  119. <el-form-item :prop="column.key" :label="column.title">
  120. <el-input
  121. v-if="column.inputType === 'Input'"
  122. v-model="params[column.key]"
  123. :disabled="column.disabled"
  124. :clearable="column.clearable"
  125. :placeholder="column.placeholder"
  126. style="width: 100%"
  127. ></el-input>
  128. <dr-popover-select
  129. v-if="column.inputType === 'PopoverSelect'"
  130. v-model="params[column.key]"
  131. :source.sync="params"
  132. :title="column.title"
  133. :type="column.referName"
  134. :disabled="column.disabled"
  135. :readonly="column.readonly"
  136. :clearable="column.clearable"
  137. :placeholder="column.placeholder"
  138. :data-mapping="column.dataMapping"
  139. >
  140. </dr-popover-select>
  141. <el-input
  142. v-if="column.inputType === 'Textarea'"
  143. v-model="params[column.key]"
  144. type="textarea"
  145. :disabled="column.disabled"
  146. :clearable="column.clearable"
  147. :placeholder="column.placeholder"
  148. style="width: 100%"
  149. ></el-input>
  150. <el-input-number
  151. v-if="column.inputType === 'InputNumber'"
  152. v-model="params[column.key]"
  153. :disabled="column.disabled"
  154. :clearable="column.clearable"
  155. :placeholder="column.placeholder"
  156. :controls-position="column.controlsPosition"
  157. style="width: 100%"
  158. ></el-input-number>
  159. <el-select
  160. v-if="column.inputType === 'Select'"
  161. v-model="params[column.key]"
  162. :disabled="column.disabled"
  163. :clearable="column.clearable"
  164. :placeholder="column.placeholder"
  165. style="width: 100%"
  166. >
  167. <el-option
  168. v-for="item in dict.type[column.referName]"
  169. :key="item.value"
  170. :label="item.label"
  171. :value="item.value"
  172. >
  173. </el-option>
  174. </el-select>
  175. <el-date-picker
  176. v-if="column.inputType === 'DatePicker'"
  177. v-model="params[column.key]"
  178. :type="column.type"
  179. :disabled="column.disabled"
  180. :clearable="column.clearable"
  181. :placeholder="column.placeholder"
  182. :value-format="column.valueFormat"
  183. :picker-options="column.pickerOptions"
  184. style="width: 100%"
  185. >
  186. </el-date-picker>
  187. <file-upload
  188. v-if="column.inputType === 'Upload'"
  189. v-model="params[column.key]"
  190. :file-type="column.fileType"
  191. ></file-upload>
  192. </el-form-item>
  193. </el-col>
  194. </el-row>
  195. <el-form-item label-width="0">
  196. <el-tabs v-model="tabName">
  197. <el-tab-pane
  198. v-for="(column, index) in tabColumns"
  199. :key="index"
  200. :label="column.title"
  201. :name="column.key"
  202. >
  203. <el-table :data="params[column.key]">
  204. <el-table-column label="序号">
  205. <template slot-scope="scope">
  206. {{ scope.$index + 1 }}
  207. </template>
  208. </el-table-column>
  209. <el-table-column
  210. v-for="(cColumn, cIndex) in column.tableColumns"
  211. :key="cIndex"
  212. :prop="cColumn.key"
  213. :label="cColumn.title"
  214. :width="cColumn.width"
  215. show-overflow-tooltip
  216. >
  217. <template slot-scope="scope">
  218. <el-input
  219. v-if="cColumn.inputType === 'Input'"
  220. v-model="scope.row[cColumn.key]"
  221. :size="size"
  222. :disabled="cColumn.disabled"
  223. :clearable="cColumn.clearable"
  224. :placeholder="cColumn.placeholder"
  225. style="width: 100%"
  226. ></el-input>
  227. <dr-computed-input
  228. v-else-if="cColumn.inputType === 'ComputedInput'"
  229. v-model="scope.row[cColumn.key]"
  230. :source="scope.row"
  231. :computed="cColumn.computed"
  232. :placeholder="cColumn.placeholder"
  233. style="width: 100%"
  234. ></dr-computed-input>
  235. <dr-popover-select
  236. v-else-if="cColumn.inputType === 'PopoverSelect'"
  237. v-model="scope.row[cColumn.key]"
  238. :size="size"
  239. :title="cColumn.title"
  240. :source.sync="scope.row"
  241. :type="cColumn.referName"
  242. :disabled="cColumn.disabled"
  243. :readonly="cColumn.readonly"
  244. :clearable="cColumn.clearable"
  245. :placeholder="cColumn.placeholder"
  246. :data-mapping="cColumn.dataMapping"
  247. @change="fetchRefer"
  248. >
  249. </dr-popover-select>
  250. <el-input-number
  251. v-else-if="cColumn.inputType === 'InputNumber'"
  252. v-model="scope.row[cColumn.key]"
  253. :size="size"
  254. :disabled="cColumn.disabled"
  255. :clearable="cColumn.clearable"
  256. :placeholder="cColumn.placeholder"
  257. :controls-position="cColumn.controlsPosition"
  258. style="width: 100%"
  259. ></el-input-number>
  260. <el-select
  261. v-else-if="cColumn.inputType === 'Select'"
  262. v-model="scope.row[cColumn.key]"
  263. :disabled="cColumn.disabled"
  264. :clearable="cColumn.clearable"
  265. :placeholder="cColumn.placeholder"
  266. style="width: 100%"
  267. >
  268. <el-option
  269. v-for="item in dict.type[cColumn.referName]"
  270. :key="item.value"
  271. :label="item.label"
  272. :value="item.value"
  273. >
  274. </el-option>
  275. </el-select>
  276. <span v-else> {{ scope.row[cColumn.key] }}</span>
  277. </template>
  278. </el-table-column>
  279. <el-table-column fixed="right" label="操作" width="100">
  280. <template slot="header" slot-scope="scope">
  281. <el-button
  282. circle
  283. icon="el-icon-plus"
  284. :size="size"
  285. @click="useRowAdd(tabName)"
  286. >
  287. </el-button>
  288. </template>
  289. <template slot-scope="scope">
  290. <el-button
  291. circle
  292. icon="el-icon-minus"
  293. :size="size"
  294. @click.native.prevent="useRowRemove(tabName, scope)"
  295. >
  296. </el-button>
  297. </template>
  298. </el-table-column>
  299. </el-table>
  300. </el-tab-pane>
  301. </el-tabs>
  302. </el-form-item>
  303. </el-form>
  304. </el-drawer>
  305. </template>