index.vue 9.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350
  1. <script>
  2. import useColumns from "./columns";
  3. import {
  4. addTargetTemplate,
  5. updateTargetTemplate,
  6. getTargetTemplate,
  7. checkQuote,
  8. } from "@/api/business/spd/starget/targetTemplate";
  9. export default {
  10. name: "AddDrawer",
  11. props: {
  12. dict: {
  13. type: Object,
  14. },
  15. selectData: {
  16. type: [Array],
  17. require: true,
  18. },
  19. addType: {
  20. type: String,
  21. default: "add",
  22. },
  23. },
  24. components: {
  25. ElSuperForm: () => import("@/components/super-form/index.vue"),
  26. ElSuperTable: () => import("@/components/super-table/index.vue"),
  27. ElPopoverSelectV2: () => import("@/components/popover-select-v2/index.vue"),
  28. },
  29. data() {
  30. const {
  31. TabColumns,
  32. TableColumns,
  33. TabColumns: [
  34. {
  35. item: { key: tabName },
  36. },
  37. ],
  38. } = useColumns();
  39. const rules = this.$init.rules([...TabColumns, ...TableColumns]);
  40. const params = this.$init.params([...TabColumns, ...TableColumns]);
  41. return {
  42. width: "100%",
  43. visible: false,
  44. loading: false,
  45. rules: rules,
  46. params: params,
  47. tabName: tabName,
  48. TabColumns: TabColumns,
  49. TableColumns: TableColumns,
  50. };
  51. },
  52. computed: {
  53. title: {
  54. get() {
  55. const { addType } = this;
  56. if (addType === "add") {
  57. return "新 增";
  58. }
  59. if (addType === "edit") {
  60. return "编 辑";
  61. }
  62. },
  63. set() {},
  64. },
  65. disabled: {
  66. get() {
  67. const {
  68. addType,
  69. selectData,
  70. selectData: [{ status } = {}],
  71. } = this.$props;
  72. if (addType === "add") {
  73. return false;
  74. }
  75. if (addType === "edit") {
  76. if (selectData.length !== 1) {
  77. return true;
  78. }
  79. if (selectData.length === 1 && status === "1") {
  80. return true;
  81. }
  82. if (selectData.length === 1 && status === "2") {
  83. return true;
  84. }
  85. }
  86. },
  87. set() {},
  88. },
  89. },
  90. watch: {},
  91. methods: {
  92. changePuOrgName(prop) {
  93. console.log("changePuOrgName", prop);
  94. },
  95. changeMaterialName(prop) {
  96. console.log("changeMaterialName", prop);
  97. },
  98. //查询目标模板详情
  99. async fetchTemplate(prop) {
  100. try {
  101. // try
  102. this.loading = true;
  103. const { code, data } = await getTargetTemplate(prop);
  104. if (code === 200) {
  105. this.params = data;
  106. return true;
  107. } else {
  108. return false;
  109. }
  110. } catch (err) {
  111. // catch
  112. console.error(err);
  113. } finally {
  114. // finally
  115. this.loading = false;
  116. }
  117. },
  118. //打开组件
  119. async open() {
  120. const { addType, selectData } = this.$props;
  121. if (addType === "add") {
  122. this.visible = true;
  123. }
  124. if (addType === "edit") {
  125. const [{ id }] = selectData;
  126. //校验目标模板是否存在引用
  127. const { code, data } = await checkQuote(id);
  128. if(code == '200'){
  129. if(data){
  130. this.$modal.msgError("该目标模板存在引用,无法修改!");
  131. this.visible = false;
  132. return;
  133. }
  134. }else{
  135. this.$modal.msgError("校验该目标模板是否存在引用异常,无法修改!");
  136. this.visible = false;
  137. return;
  138. }
  139. this.visible = await this.fetchTemplate(id);
  140. this.params.indexs = this.params.indexs.map((item) => ({ ...item }));
  141. this.params.dimensionalitys = this.params.dimensionalitys.map(
  142. (item) => ({ ...item })
  143. );
  144. this.params.cycles = this.params.cycles.map((item) => ({ ...item }));
  145. }
  146. },
  147. //关闭页面
  148. async hide() {
  149. const {
  150. TabColumns,
  151. TableColumns,
  152. TabColumns: [
  153. {
  154. item: { key: tabName },
  155. },
  156. ],
  157. } = useColumns();
  158. this.visible = false;
  159. this.tabName = tabName;
  160. this.params = this.$init.params([...TabColumns, ...TableColumns]);
  161. },
  162. //增行
  163. async useRowAdd(prop) {
  164. const { TabColumns } = this;
  165. const { TableColumns } = TabColumns.find(
  166. ({ item: { key } }) => key === prop
  167. );
  168. console.log(prop, this.$init.params(TableColumns));
  169. this.params[prop].push({
  170. delFlag: "0",
  171. ...this.$init.params(TableColumns),
  172. });
  173. console.log("this.params[prop]", this.params[prop]);
  174. },
  175. //删行
  176. async useRowRemove(prop, scope) {
  177. const { addType } = this.$props;
  178. const {
  179. row: { $index },
  180. } = scope;
  181. if (addType === "add") {
  182. this.params[prop].splice($index, 1);
  183. }
  184. if (addType === "edit") {
  185. this.params[prop] = this.params[prop].map((item, index) => ({
  186. ...item,
  187. delFlag: index === $index ? "2" : item.delFlag,
  188. }));
  189. console.log(this.params[prop]);
  190. }
  191. },
  192. //确认
  193. async useSubmit(prop) {
  194. this.$refs[prop].$refs[prop].validate(async (valid) => {
  195. if (valid) {
  196. try {
  197. this.loading = true;
  198. // const {
  199. // params,
  200. // params: { paramsOrgs, paramsItems },
  201. // } = this;
  202. // if (this.addType === "edit") {
  203. // params.paramsOrgs = paramsOrgs.filter(
  204. // (item) => item.orgName
  205. // );
  206. // params.paramsItems = paramsItems.filter(
  207. // (item) => item.materialName
  208. // );
  209. // }
  210. const { addType } = this.$props;
  211. let res = null;
  212. if (addType === "add") {
  213. res = await addTargetTemplate(this.params);
  214. }
  215. if (addType === "edit") {
  216. res = await updateTargetTemplate(this.params);
  217. }
  218. if (res.code === 200) {
  219. this.hide();
  220. this.$emit("success");
  221. this.$notify.success(res.msg);
  222. }
  223. } catch (err) {
  224. // catch
  225. console.error(err);
  226. } finally {
  227. // finally
  228. this.loading = false;
  229. }
  230. } else {
  231. return false;
  232. }
  233. });
  234. },
  235. },
  236. created() {
  237. console.log("params", this.params);
  238. },
  239. mounted() {},
  240. destroyed() {},
  241. };
  242. </script>
  243. <template>
  244. <el-button
  245. v-bind="$attrs"
  246. v-on="$listeners"
  247. :disabled="disabled"
  248. @click="open"
  249. >
  250. {{ title }}
  251. <el-drawer
  252. :size="width"
  253. :title="title"
  254. :visible.sync="visible"
  255. append-to-body
  256. destroy-on-close
  257. @close="hide"
  258. >
  259. <el-super-form
  260. v-model="params"
  261. :dict="dict"
  262. :rules="rules"
  263. :size="$attrs.size"
  264. :columns="TableColumns"
  265. ref="superForm"
  266. label-width="auto"
  267. label-position="right"
  268. style="padding: 20px"
  269. >
  270. <!-- <template slot="puOrgName" slot-scope="scope">
  271. <component
  272. v-bind="scope.attr"
  273. v-model="scope.row[scope.item.key]"
  274. :size="$attrs.size"
  275. :source.sync="scope.row"
  276. @change="changePuOrgName({ ...scope, select: $event })"
  277. >
  278. </component
  279. ></template> -->
  280. </el-super-form>
  281. <el-tabs v-model="tabName" style="padding: 0 20px 20px">
  282. <el-tab-pane
  283. v-for="({ item, TableColumns: columns }, index) in TabColumns"
  284. :key="index"
  285. :label="item.title"
  286. :name="item.key"
  287. lazy
  288. >
  289. <el-super-table
  290. v-model="params[item.key]"
  291. :dict="dict"
  292. :ref="tabName"
  293. :columns="columns"
  294. :size="$attrs.size"
  295. >
  296. <!-- <template slot="materialName" slot-scope="scope">
  297. <component
  298. v-bind="scope.attr"
  299. v-model="scope.row[scope.item.key]"
  300. :size="$attrs.size"
  301. :source.sync="scope.row"
  302. @change="changeMaterialName(scope)"
  303. >
  304. </component>
  305. </template> -->
  306. <el-table-column fixed="right" label="操作" width="75">
  307. <template slot="header" slot-scope="scope">
  308. <el-button
  309. circle
  310. icon="el-icon-plus"
  311. :size="$attrs.size"
  312. @click="useRowAdd(tabName)"
  313. >
  314. </el-button>
  315. </template>
  316. <template slot-scope="scope">
  317. <el-button
  318. circle
  319. icon="el-icon-minus"
  320. :size="$attrs.size"
  321. @click.native.prevent="useRowRemove(tabName, scope)"
  322. >
  323. </el-button>
  324. </template>
  325. </el-table-column>
  326. </el-super-table>
  327. </el-tab-pane>
  328. </el-tabs>
  329. <div style="padding: 20px; text-align: right">
  330. <el-button :size="$attrs.size" :loading="loading" @click="hide"
  331. >取 消</el-button
  332. >
  333. <el-button
  334. type="primary"
  335. :size="$attrs.size"
  336. :loading="loading"
  337. @click="useSubmit('superForm')"
  338. >确 认</el-button
  339. >
  340. </div>
  341. </el-drawer>
  342. </el-button>
  343. </template>
  344. <style scoped>
  345. ::v-deep .el-table__row.is-hidden {
  346. display: none;
  347. }
  348. </style>