add.vue 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324
  1. <template>
  2. <div class="safety-platform-container">
  3. <header class="safety-platform-container__header">
  4. <div class="breadcrumb-title">
  5. <BreadcrumbBack />
  6. 新增安全责任区域
  7. </div>
  8. </header>
  9. <main class="safety-platform-container__main">
  10. <el-form ref="formRef" label-width="auto" :model="formValue" :rules="rules">
  11. <!-- <el-form-item label="楼号" prop="buildingNo">
  12. <el-input v-model="formValue.buildingNo" size="large" placeholder="请输入楼号" style="width: 50%" />
  13. </el-form-item> -->
  14. <el-form-item label="楼宇/区域" prop="buildingArea">
  15. <el-input v-model="formValue.buildingArea" size="large" placeholder="请输入楼宇/区域" style="width: 50%" />
  16. </el-form-item>
  17. <el-form-item label="楼层/房号" prop="floorRoomNo">
  18. <el-input v-model="formValue.floorRoomNo" size="large" placeholder="请输入楼层/房号" style="width: 50%" />
  19. </el-form-item>
  20. <el-form-item label="名称/功能" prop="nameFunction">
  21. <el-input v-model="formValue.nameFunction" size="large" placeholder="请输入名称/功能" style="width: 50%" />
  22. </el-form-item>
  23. <el-form-item label="安全责任所/中心" prop="safetyResponsibleCenter">
  24. <el-cascader
  25. v-model="formValue.safetyResponsibleCenterId"
  26. style="width: 50%"
  27. size="large"
  28. :ref="(el) => (cascaderRef['safetyResponsibleCenter'] = el)"
  29. :options="firstLevelDepts"
  30. :props="cascaderProp"
  31. :show-all-levels="false"
  32. placeholder="请选择安全责任部门"
  33. filterable
  34. clearable
  35. @change="(val) => handleChangeDept(val, 'safetyResponsibleCenter')"
  36. />
  37. </el-form-item>
  38. <el-form-item label="安全责任所/中心负责人" prop="safetyCenterManager">
  39. <el-select
  40. v-model="formValue.safetyCenterManager"
  41. placeholder="请选择"
  42. size="large"
  43. style="width: 50%"
  44. filterable
  45. @change="(val) => syncUserName(safetyCenterManagerOptions, val, 'safetyCenterManagerName')"
  46. >
  47. <el-option
  48. v-for="item in safetyCenterManagerOptions"
  49. :key="item.value"
  50. :label="item.label"
  51. :value="item.value"
  52. />
  53. </el-select>
  54. </el-form-item>
  55. <el-form-item label="安全责任部门" prop="safetyResponsibleDepartment">
  56. <!-- <el-select
  57. v-model="formValue.safetyResponsibleDepartment"
  58. placeholder="请选择"
  59. size="large"
  60. style="width: 50%"
  61. filterable
  62. >
  63. <el-option
  64. v-for="item in firstLevelDepts"
  65. :key="item.hrIdtOrgId"
  66. :label="item.deptName"
  67. :value="item.deptName"
  68. />
  69. </el-select> -->
  70. <el-cascader
  71. v-model="formValue.safetyResponsibleDepartmentId"
  72. style="width: 50%"
  73. size="large"
  74. :ref="(el) => (cascaderRef['safetyResponsibleDepartment'] = el)"
  75. :options="firstLevelDepts"
  76. :props="cascaderProp"
  77. :show-all-levels="false"
  78. placeholder="请选择安全责任部门"
  79. filterable
  80. clearable
  81. @change="(val) => handleChangeDept(val, 'safetyResponsibleDepartment')"
  82. />
  83. </el-form-item>
  84. <el-form-item label="安全责任部门负责人" prop="safetyDepartmentManager">
  85. <el-select
  86. v-model="formValue.safetyDepartmentManager"
  87. placeholder="请选择"
  88. size="large"
  89. style="width: 50%"
  90. filterable
  91. @change="(val) => syncUserName(userOptions, val, 'safetyDepartmentManagerName')"
  92. >
  93. <el-option v-for="item in userOptions" :key="item.value" :label="item.label" :value="item.value" />
  94. </el-select>
  95. </el-form-item>
  96. <el-form-item label="安全具体责任人" prop="safetySpecificPerson">
  97. <el-select
  98. v-model="formValue.safetySpecificPerson"
  99. placeholder="请选择"
  100. size="large"
  101. style="width: 50%"
  102. filterable
  103. @change="(val) => syncUserName(userOptions, val, 'safetySpecificPersonName')"
  104. >
  105. <el-option v-for="item in userOptions" :key="item.value" :label="item.label" :value="item.value" />
  106. </el-select>
  107. </el-form-item>
  108. <el-form-item label="安全具体责任人联系方式" prop="safetyPersonContact">
  109. <el-input
  110. v-model="formValue.safetyPersonContact"
  111. size="large"
  112. placeholder="请输入联系方式"
  113. style="width: 50%"
  114. />
  115. </el-form-item>
  116. </el-form>
  117. </main>
  118. <footer class="safety-platform-container__footer">
  119. <el-button @click="$router.push({ name: 'areaResponsibilities:public' })">返回</el-button>
  120. <el-button type="primary" :loading="submiting" @click="handleSubmit">提交</el-button>
  121. </footer>
  122. </div>
  123. </template>
  124. <script lang="ts" setup>
  125. import { ref, reactive, onMounted, nextTick } from 'vue';
  126. import { useRouter } from 'vue-router';
  127. import { ElMessage } from 'element-plus';
  128. import { getAllDepartments } from '@/api/auth/dept';
  129. import { formatDeptTree } from '@/views/disaster/utils/formatDeptTree';
  130. import { areaCheckListSavaArea, queryAvailableUserList } from '@/api/production-safety/responsibility-implementation';
  131. const router = useRouter();
  132. const formRef = ref<any>(null);
  133. const submiting = ref(false);
  134. const userOptions = ref<any[]>([]);
  135. const firstLevelDepts = ref<any[]>([]);
  136. const cascaderProp = {
  137. expandTrigger: 'click',
  138. checkStrictly: true,
  139. // emitPath: false,
  140. value: 'id',
  141. label: 'deptName',
  142. };
  143. const cascaderRef = ref({});
  144. const safetyCenterManagerOptions = ref<any[]>([]);
  145. const formValue = reactive({
  146. buildingNo: '',
  147. buildingArea: '',
  148. floorRoomNo: '',
  149. nameFunction: '',
  150. safetyResponsibleCenter: '',
  151. safetyResponsibleCenterId: [],
  152. safetyCenterManager: null as number | null,
  153. safetyCenterManagerName: '',
  154. safetyResponsibleDepartment: '',
  155. safetyResponsibleDepartmentId: [],
  156. safetyDepartmentManager: null as number | null,
  157. safetyDepartmentManagerName: '',
  158. safetySpecificPerson: null as number | null,
  159. safetySpecificPersonName: '',
  160. safetyPersonContact: '',
  161. });
  162. const rules = reactive({
  163. // buildingNo: [{ required: true, message: '请输入楼号' }],
  164. buildingArea: [{ required: true, message: '请输入楼宇/区域' }],
  165. floorRoomNo: [{ required: true, message: '请输入楼层/房号' }],
  166. nameFunction: [{ required: true, message: '请输入名称/功能' }],
  167. safetyResponsibleCenter: [{ required: true, message: '请选择安全责任所/中心', trigger: 'change' }],
  168. safetyCenterManager: [{ required: true, message: '请选择安全责任所/中心负责人', trigger: 'change' }],
  169. safetyResponsibleDepartment: [{ required: true, message: '请选择安全责任部门', trigger: 'change' }],
  170. safetyDepartmentManager: [{ required: true, message: '请选择安全责任部门负责人', trigger: 'change' }],
  171. safetySpecificPerson: [{ required: true, message: '请选择安全具体责任人', trigger: 'change' }],
  172. safetyPersonContact: [
  173. { required: true, message: '请输入安全具体责任人联系方式' },
  174. { pattern: /^1[3-9]\d{9}$/, message: '请输入正确的手机号码格式' },
  175. ],
  176. });
  177. // 获取部门数据
  178. const getDeptData = () => {
  179. getAllDepartments().then((res) => {
  180. firstLevelDepts.value = formatDeptTree(res);
  181. });
  182. };
  183. const handleChangeDept = (val, prop) => {
  184. const cascader = cascaderRef.value?.[prop];
  185. const deptInfo = cascader?.getCheckedNodes();
  186. formValue[prop] = deptInfo[0]?.label;
  187. formRef.value.validateField(prop);
  188. nextTick(() => {
  189. handleQueryAvailableUserList(deptInfo[0]?.label, prop);
  190. });
  191. };
  192. const handleQueryAvailableUserList = (value, prop) => {
  193. switch (prop) {
  194. case 'safetyResponsibleCenter':
  195. formValue.safetyCenterManager = null;
  196. getUserData(safetyCenterManagerOptions, value);
  197. break;
  198. case 'safetyResponsibleDepartment':
  199. formValue.safetySpecificPerson = null;
  200. formValue.safetyDepartmentManager = null;
  201. getUserData(userOptions, value);
  202. break;
  203. default:
  204. break;
  205. }
  206. };
  207. const getUserData = (optionList, deptName, realname = '') => {
  208. queryAvailableUserList({
  209. pageNumber: 1,
  210. pageSize: 200,
  211. queryParam: {
  212. deptName,
  213. realname,
  214. },
  215. }).then((res: any) => {
  216. optionList['value'] = (res.records || []).map((u: any) => ({
  217. value: u.id,
  218. label: u.realname,
  219. }));
  220. });
  221. };
  222. const syncUserName = (optionList, id: number, nameField: string) => {
  223. const user = optionList?.find((u) => u.value === id);
  224. if (user) {
  225. formValue[nameField] = user.label;
  226. console.log(formValue[nameField]);
  227. }
  228. };
  229. // const handleSpecificPersonChange = (id: number) => {
  230. // const user = userOptions.value.find((u) => u.id === id);
  231. // if (user) {
  232. // formValue.safetySpecificPersonName = user.name;
  233. // formValue.safetyPersonContact = user.mobile;
  234. // }
  235. // };
  236. onMounted(() => {
  237. getDeptData();
  238. // getUserData();
  239. });
  240. const handleSubmit = () => {
  241. console.log(formValue);
  242. formRef.value?.validate((valid: boolean) => {
  243. if (valid) {
  244. submiting.value = true;
  245. areaCheckListSavaArea({
  246. ...formValue,
  247. type: 1,
  248. safetyResponsibleDepartmentId: JSON.stringify(formValue.safetyResponsibleDepartmentId),
  249. safetyResponsibleCenterId: JSON.stringify(formValue.safetyResponsibleCenterId),
  250. })
  251. .then(() => {
  252. ElMessage.success('创建成功!');
  253. router.push({ name: 'areaResponsibilities:public' });
  254. })
  255. .finally(() => {
  256. submiting.value = false;
  257. });
  258. }
  259. });
  260. };
  261. </script>
  262. <style lang="scss" scoped>
  263. @use '@/styles/page-main-layout.scss' as *;
  264. @use '@/styles/page-details-layout.scss' as *;
  265. @use '@/styles/basic-table-action.scss' as *;
  266. .editor-container {
  267. border: 1px solid #dcdfe6;
  268. border-radius: 4px;
  269. margin-right: 20px;
  270. overflow: hidden;
  271. }
  272. // :deep(.breadcrumb .title) {
  273. // margin-left: 0;
  274. // }
  275. // .main {
  276. // display: flex;
  277. // flex-direction: column;
  278. // padding: 20px;
  279. // flex: 1;
  280. // overflow: hidden;
  281. // background-color: #fff;
  282. // }
  283. // .button-content {
  284. // margin-bottom: 20px;
  285. // }
  286. // .page-content {
  287. // display: flex;
  288. // justify-content: flex-end;
  289. // }
  290. // // :deep(.el-form) {
  291. // // flex: 1;
  292. // // overflow: hidden;
  293. // // overflow-y: auto;
  294. // // }
  295. </style>