add.vue 12 KB

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