overParam.vue 7.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292
  1. <script setup lang="ts">
  2. import { ref, computed } from "vue"
  3. import type { Header } from "@/components/Table/table-partials/models"
  4. import { maper } from "@/core/utils/utils"
  5. import Rs from "@/core/services/RequestService"
  6. import type { VbFormItem } from "@/components/Forms/models"
  7. import OrgSelectTree from "@/components/Tree/OrgSelectTree.vue"
  8. import AreaCascadeSelect from "@/components/select/AreaCascadeSelect.vue"
  9. import { ElInput } from "element-plus"
  10. import { RULE_KEYS } from "@/core/config/rules"
  11. import { ElSelect, ElRadioGroup, ElCheckboxGroup } from "element-plus"
  12. const table = ref<any>()
  13. const cols = ref<Array<Header>>([
  14. { name: "名称", field: "name", align: "left", width: "200px" },
  15. { name: "简称", field: "simple_name" },
  16. //{ name: "父级", field: "parent_id" },
  17. { name: "code", field: "code" },
  18. { name: "省/市/区", field: "province_city_district" },
  19. { name: "描述", field: "description" },
  20. {
  21. name: "操作",
  22. field: "action",
  23. width: "150px",
  24. },
  25. ])
  26. const modal = ref<any>()
  27. //定义需要操作的类型
  28. const opreationType = ref<"A" | "U" | "D">("A")
  29. const modalTitlePrefix = computed(() => {
  30. return opreationType.value == "A" ? "新增" : opreationType.value == "U" ? "编辑" : ""
  31. })
  32. //后期api完善了这里可以改成 返回Promise的function
  33. const saveUrl = computed(() => {
  34. return opreationType.value == "A"
  35. ? "sys/organizational/insert"
  36. : opreationType.value == "U"
  37. ? "sys/organizational/update"
  38. : opreationType.value == "D"
  39. ? "sys/organizational/delById"
  40. : ""
  41. })
  42. const areaData = ref([])
  43. function load() {
  44. Rs.get("sys/dict/getArea").then((res) => {
  45. areaData.value = res.data
  46. })
  47. }
  48. load()
  49. //只放增改传到后台的共用参数,其余需要modal显示的参数另外定义
  50. const emptyData = {
  51. org_id: "",
  52. parent_id: "0",
  53. name: "",
  54. simple_name: "",
  55. code: "",
  56. description: "",
  57. province: "",
  58. city: "",
  59. district: "",
  60. }
  61. const formData = ref<any>(
  62. Object.assign({}, emptyData, { province_city_district: ["", "", ""], simple_name2: [], simple_name3: false })
  63. )
  64. const items: Array<VbFormItem> = [
  65. {
  66. field: "parent_id",
  67. label: "父组织",
  68. required: false,
  69. component: OrgSelectTree,
  70. span: 12,
  71. },
  72. {
  73. field: "code",
  74. label: "CODE",
  75. required: true,
  76. component: ElInput,
  77. rules: [RULE_KEYS.REQUIRED, RULE_KEYS.MIN, RULE_KEYS.MAX],
  78. ruleFormat: [["CODE"], [2], [4]],
  79. span: 12,
  80. },
  81. {
  82. field: "name",
  83. label: "名称",
  84. required: true,
  85. component: ElInput,
  86. span: 12,
  87. },
  88. {
  89. field: "simple_name",
  90. label: "简称",
  91. component: ElInput,
  92. span: 12,
  93. },
  94. {
  95. field: "province_city_district",
  96. label: "省/市/区",
  97. component: AreaCascadeSelect,
  98. listeners: { change: pcdChange },
  99. //component: ElCascader,
  100. // props: {
  101. // expandTrigger: "hover" as const,
  102. // clearable: true,
  103. // checkStrictly: true,
  104. // options: areaData.value,
  105. // },
  106. },
  107. {
  108. field: "description",
  109. label: "描述",
  110. component: ElInput,
  111. type: "textarea",
  112. },
  113. {
  114. field: "simple_name",
  115. label: "简称",
  116. component: ElSelect,
  117. span: 12,
  118. data: [
  119. { label: "Q", value: "Q" },
  120. { label: "W", value: "W" },
  121. { label: "E", value: "E", disabled: true },
  122. ],
  123. },
  124. {
  125. field: "simple_name",
  126. label: "简称",
  127. component: ElRadioGroup,
  128. span: 12,
  129. data: [
  130. { label: "Q", value: "Q" },
  131. { label: "W", value: "W" },
  132. { label: "E", value: "E", disabled: true },
  133. ],
  134. },
  135. {
  136. field: "simple_name2", //多选时 对象属性应该是 []
  137. label: "简称2",
  138. component: ElCheckboxGroup,
  139. span: 12,
  140. data: [
  141. { label: "Q1", value: "Q" },
  142. { label: "W1", value: "W" },
  143. { label: "E1", value: "E", disabled: true },
  144. ],
  145. },
  146. {
  147. field: "simple_name3", //单选时 对象属性应该是 bool
  148. label: "简称3",
  149. component: ElCheckboxGroup,
  150. span: 12,
  151. data: [{ label: "Q1", value: "1" }],
  152. },
  153. ]
  154. function pcdChange(v: Array<string>) {
  155. console.log("PCD", v)
  156. formData.value.province = v[0]
  157. formData.value.city = v[1]
  158. formData.value.district = v[2]
  159. }
  160. function add() {
  161. opreationType.value = "A"
  162. formData.value = Object.assign({ province_city_district: ["", "", ""] }, emptyData)
  163. modal.value.show()
  164. }
  165. function edit(row: any) {
  166. opreationType.value = "U"
  167. formData.value = Object.assign({}, row)
  168. modal.value.show()
  169. }
  170. function deleteRow(row: any) {
  171. //console.log("DELETE_ROW", row)
  172. opreationType.value = "D"
  173. Rs.post(saveUrl.value, { data: [row.org_id] }).then(() => {
  174. table.value.search()
  175. })
  176. }
  177. function onCancel() {
  178. //console.log("CANCEL", form)
  179. }
  180. function onSave() {
  181. if (saveUrl.value) {
  182. const data = Object.assign({}, emptyData)
  183. maper(data, formData.value)
  184. Rs.post(saveUrl.value, { data: data }).then(() => {
  185. table.value.search()
  186. })
  187. }
  188. }
  189. /**
  190. *
  191. <template #form>
  192. <el-row :gutter="20">
  193. <el-col :span="12">
  194. <el-form-item
  195. label="父组织"
  196. prop="parent_id"
  197. required
  198. :rules="[{ required: true, message: '必填', trigger: 'blur' }]"
  199. >
  200. <OrgSelectTree v-model:value="formData.parent_id"></OrgSelectTree>
  201. </el-form-item>
  202. </el-col>
  203. <el-col :span="12">
  204. <el-form-item
  205. label="CODE"
  206. prop="code"
  207. required
  208. :rules="[
  209. { required: true, message: '必填', trigger: ['blur'] },
  210. { min: 2, max: 4, message: '2至4个字符', trigger: ['blur'] },
  211. ]"
  212. >
  213. <el-input v-model="formData.code"></el-input>
  214. </el-form-item>
  215. </el-col>
  216. <el-col :span="12">
  217. <el-form-item
  218. label="名称"
  219. prop="name"
  220. required
  221. :rules="[{ required: true, message: '必填', trigger: ['blur'] }]"
  222. >
  223. <el-input v-model="formData.name"></el-input>
  224. </el-form-item>
  225. </el-col>
  226. <el-col :span="12">
  227. <el-form-item label="简称" prop="simple_name">
  228. <el-input v-model="formData.simple_name"></el-input>
  229. </el-form-item>
  230. </el-col>
  231. <el-col :span="24">
  232. <el-form-item label="省/市/区" prop="province_city_district">
  233. <AreaCascadeSelect v-model:value="province_city_district" @change="pcdChange"></AreaCascadeSelect>
  234. </el-form-item>
  235. </el-col>
  236. <el-col :span="24">
  237. <el-form-item label="描述" prop="description">
  238. <el-input type="textarea" v-model="formData.description"></el-input>
  239. </el-form-item>
  240. </el-col>
  241. </el-row>
  242. </template>
  243. <template #body>
  244. <VbForm :items="items" v-model:data="formData"></VbForm>
  245. </template>
  246. */
  247. </script>
  248. <template>
  249. <VbTreeTable
  250. ref="table"
  251. url="sys/organizational/selectForPage"
  252. method="post"
  253. :header="cols"
  254. key-field="org_id"
  255. children-field="children"
  256. :expand-depth="1"
  257. :interval-left="10"
  258. :fixed-column="true"
  259. :fixed-number="1"
  260. :fixed-right-number="1"
  261. >
  262. <template #table-tool="">
  263. <el-button class="ms-3 mt-0 btn btn-sm btn-primary" @click="add">新增</el-button>
  264. </template>
  265. <template #province_city_district="{ row }">
  266. {{
  267. `${row.province_name ?? ""}${row.city_name ? `/${row.city_name}` : ``}${
  268. row.district_name ? `/${row.district_name}` : ``
  269. }`
  270. }}
  271. </template>
  272. <template #action="{ row }">
  273. <span class="text-primary table-action" @click="edit(row)">编辑</span>
  274. <span class="text-danger table-action" @click="deleteRow(row)">删除</span>
  275. </template>
  276. </VbTreeTable>
  277. <VbModal
  278. v-model:modal="modal"
  279. v-model:form-data="formData"
  280. :form-items="items"
  281. backdrop="static"
  282. :keyboard="false"
  283. :title-prefix="modalTitlePrefix"
  284. title="组织机构"
  285. form-label-width="70"
  286. modal-body-class="px-10"
  287. @cancel="onCancel"
  288. @confirm="onSave"
  289. ></VbModal>
  290. </template>