AppDeployBindOrg.vue 10 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343
  1. <template>
  2. <el-dialog
  3. class="page-dialog"
  4. :visible.sync="modalIsShow"
  5. top="10px"
  6. width="1000px"
  7. :close-on-click-modal="false"
  8. :close-on-press-escape="false"
  9. :show-close="false"
  10. append-to-body
  11. @open="visibleChange"
  12. >
  13. <div class="box-justify" slot="title">
  14. <h3>应用关联机构</h3>
  15. <div>
  16. <el-button
  17. size="mini"
  18. type="primary"
  19. :disabled="isSubmit"
  20. @click="submit"
  21. >确定</el-button
  22. >
  23. <el-button size="mini" type="danger" plain @click="cancel"
  24. >取消</el-button
  25. >
  26. </div>
  27. </div>
  28. <el-tabs v-model="tabType" type="card" @tab-click="tabChange">
  29. <el-tab-pane name="selected">
  30. <span slot="label">
  31. <span>已选机构</span>
  32. <span class="color-primary">({{ curSelectedOrgs.length }})</span>
  33. </span>
  34. <el-table :data="curSelectedOrgs">
  35. <!-- <el-table-column width="60" type="index" label="序号" align="center">
  36. </el-table-column> -->
  37. <el-table-column prop="id" label="ID" width="80"></el-table-column>
  38. <el-table-column prop="name" label="名称"> </el-table-column>
  39. <el-table-column prop="code" label="编码"> </el-table-column>
  40. <el-table-column prop="typeName" label="一级分类" width="100">
  41. </el-table-column>
  42. <el-table-column prop="subTypesName" label="二级分类">
  43. </el-table-column>
  44. <el-table-column label="状态" width="100">
  45. <span
  46. slot-scope="scope"
  47. :class="{ 'color-primary': scope.row.selected }"
  48. >
  49. {{ scope.row.selected ? "已选择" : "未选择" }}
  50. </span>
  51. </el-table-column>
  52. <el-table-column label="操作" width="80" class-name="action-column">
  53. <div slot-scope="scope">
  54. <el-button
  55. class="btn-danger"
  56. type="text"
  57. @click="toDeleteSelected(scope.row)"
  58. >
  59. 删除
  60. </el-button>
  61. </div>
  62. </el-table-column>
  63. </el-table>
  64. </el-tab-pane>
  65. <el-tab-pane name="resource">
  66. <span slot="label">机构筛选</span>
  67. <div class="part-box-filter" style="padding: 0 0 5px">
  68. <el-form :model="filter" inline>
  69. <el-form-item label="一级分类">
  70. <el-select
  71. v-model="filter.type"
  72. placeholder="选择一级分类"
  73. clearable
  74. @change="typeChange"
  75. >
  76. <el-option
  77. v-for="item in orgTypes"
  78. :key="item.code"
  79. :value="item.code"
  80. :label="item.name"
  81. >
  82. </el-option>
  83. </el-select>
  84. </el-form-item>
  85. <el-form-item label="二级分类">
  86. <el-select
  87. v-model="filter.subType"
  88. placeholder="选择二级分类"
  89. clearable
  90. >
  91. <el-option
  92. v-for="item in curSubTypes"
  93. :key="item.code"
  94. :value="item.code"
  95. :label="item.name"
  96. >
  97. </el-option>
  98. </el-select>
  99. </el-form-item>
  100. <el-form-item label="编码" label-width="50">
  101. <el-input
  102. v-model="filter.code"
  103. placeholder="编码"
  104. clearable
  105. ></el-input>
  106. </el-form-item>
  107. <el-form-item label="模糊查询">
  108. <el-input
  109. v-model.trim="filter.nameStartWith"
  110. placeholder="名称前缀"
  111. clearable
  112. ></el-input>
  113. </el-form-item>
  114. <el-form-item>
  115. <el-button type="primary" @click="toPage(1)">查询</el-button>
  116. </el-form-item>
  117. </el-form>
  118. </div>
  119. <el-table :data="orgs">
  120. <!-- <el-table-column
  121. width="60"
  122. type="index"
  123. label="序号"
  124. align="center"
  125. :index="indexMethod"
  126. >
  127. </el-table-column> -->
  128. <el-table-column prop="id" label="ID" width="80"></el-table-column>
  129. <el-table-column prop="name" label="名称"> </el-table-column>
  130. <el-table-column prop="code" label="编码"> </el-table-column>
  131. <el-table-column prop="typeName" label="一级分类" width="100">
  132. </el-table-column>
  133. <el-table-column prop="subTypesName" label="二级分类">
  134. </el-table-column>
  135. <el-table-column label="状态" width="100">
  136. <span
  137. slot-scope="scope"
  138. :class="{ 'color-primary': scope.row.selected }"
  139. >
  140. {{ scope.row.selected ? "已选择" : "未选择" }}
  141. </span>
  142. </el-table-column>
  143. <el-table-column label="操作" width="80" class-name="action-column">
  144. <div slot-scope="scope">
  145. <el-button
  146. v-if="scope.row.selected"
  147. class="btn-danger"
  148. type="text"
  149. @click="toDelete(scope.row)"
  150. >
  151. 删除
  152. </el-button>
  153. <el-button
  154. v-else
  155. class="btn-primary"
  156. type="text"
  157. @click="toSelect(scope.row)"
  158. >
  159. 添加
  160. </el-button>
  161. </div>
  162. </el-table-column>
  163. </el-table>
  164. <div class="part-page">
  165. <el-pagination
  166. background
  167. layout="total,prev, pager, next"
  168. :current-page="current"
  169. :total="total"
  170. :page-size="size"
  171. @current-change="toPage"
  172. />
  173. </div>
  174. </el-tab-pane>
  175. </el-tabs>
  176. <div slot="footer"></div>
  177. </el-dialog>
  178. </template>
  179. <script>
  180. import { orgQuery, appDeployOrgList, appDeployOrgUpdate } from "../api";
  181. export default {
  182. name: "app-deploy-bind-org",
  183. props: {
  184. instance: {
  185. type: Object,
  186. default() {
  187. return {};
  188. },
  189. },
  190. },
  191. data() {
  192. return {
  193. modalIsShow: false,
  194. filter: {
  195. type: "",
  196. subType: "",
  197. code: "",
  198. nameStartWith: "",
  199. },
  200. isSubmit: false,
  201. tabType: "selected",
  202. current: 1,
  203. size: 10,
  204. total: 10,
  205. orgTypes: this.$ls.get("orgTypes", []),
  206. orgTypeMap: this.$ls.get("orgTypeMap", {}),
  207. curSubTypes: [],
  208. orgs: [],
  209. curSelectedOrgs: [],
  210. curSelectedOrgIds: [],
  211. };
  212. },
  213. methods: {
  214. async initData() {
  215. await this.getSelectedOrgs();
  216. if (this.curSelectedOrgs && this.curSelectedOrgs.length) {
  217. this.tabType = "selected";
  218. } else {
  219. this.tabType = "resource";
  220. this.toPage(this.current);
  221. }
  222. },
  223. visibleChange() {
  224. this.initData();
  225. },
  226. cancel() {
  227. this.modalIsShow = false;
  228. },
  229. open() {
  230. this.modalIsShow = true;
  231. },
  232. typeChange() {
  233. const curType = this.orgTypes.find(
  234. (item) => item.code === this.filter.type
  235. );
  236. this.curSubTypes = curType ? curType.subTypes : [];
  237. this.filter.subType = null;
  238. },
  239. async getSelectedOrgs() {
  240. const res = await appDeployOrgList(this.instance.id);
  241. const resData = res || [];
  242. this.curSelectedOrgs = resData.map((item) => {
  243. item.typeName = this.orgTypeMap[item.type].name;
  244. item.selected = true;
  245. if (item.subTypes && item.subTypes.length) {
  246. item.subTypesName = item.subTypes
  247. .map((type) => this.orgTypeMap[item.type].subType[type])
  248. .join(",");
  249. }
  250. return item;
  251. });
  252. this.updateSelectedOrgIds();
  253. },
  254. indexMethod(index) {
  255. return index + (this.current - 1) * this.size + 1;
  256. },
  257. async getList() {
  258. const res = await orgQuery({
  259. ...this.filter,
  260. pageNumber: this.current,
  261. pageSize: this.size,
  262. });
  263. this.orgs = res.records.map((item) => {
  264. item.typeName = this.orgTypeMap[item.type].name;
  265. item.selected = this.curSelectedOrgIds.includes(item.id);
  266. if (item.subTypes && item.subTypes.length) {
  267. item.subTypesName = item.subTypes
  268. .map((type) => this.orgTypeMap[item.type].subType[type])
  269. .join(",");
  270. }
  271. return item;
  272. });
  273. this.total = res.total;
  274. },
  275. toPage(page) {
  276. this.current = page;
  277. this.getList();
  278. },
  279. tabChange(val) {
  280. if (val.name === "resource") {
  281. if (this.orgs.length) {
  282. this.orgs.forEach((item) => {
  283. item.selected = this.curSelectedOrgIds.includes(item.id);
  284. });
  285. } else {
  286. this.toPage(this.current);
  287. }
  288. }
  289. },
  290. toSelect(row) {
  291. row.selected = true;
  292. this.curSelectedOrgs.push({ ...row });
  293. this.updateSelectedOrgIds();
  294. },
  295. toDelete(row) {
  296. row.selected = false;
  297. this.toDeleteSelected(row);
  298. },
  299. toDeleteSelected(row) {
  300. const pos = this.curSelectedOrgs.findIndex((item) => item.id === row.id);
  301. this.curSelectedOrgs.splice(pos, 1);
  302. this.updateSelectedOrgIds();
  303. },
  304. updateSelectedOrgIds() {
  305. this.curSelectedOrgIds = this.curSelectedOrgs.map((item) => item.id);
  306. },
  307. async submit() {
  308. if (!this.curSelectedOrgIds.length) {
  309. const result = await this.$confirm("确定不关联任何机构吗?", "警告", {
  310. type: "warning",
  311. }).catch(() => {});
  312. if (result !== "confirm") return;
  313. }
  314. if (this.isSubmit) return;
  315. this.isSubmit = true;
  316. const datas = {
  317. id: this.instance.id,
  318. orgId: this.curSelectedOrgIds.length ? this.curSelectedOrgIds : "",
  319. };
  320. const data = await appDeployOrgUpdate(datas).catch(() => {
  321. this.isSubmit = false;
  322. });
  323. if (!data) return;
  324. this.isSubmit = false;
  325. this.$message.success("关联成功!");
  326. this.$emit("modified");
  327. this.cancel();
  328. },
  329. },
  330. };
  331. </script>