index.vue 9.6 KB

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