message.vue 15 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493
  1. <script setup lang="ts">
  2. import { ref, reactive, nextTick, onMounted, onActivated } from "vue";
  3. import { ElMessageBox, ElMessage } from "element-plus";
  4. import { Calendar } from "@element-plus/icons-vue";
  5. import { getAssessmentDetails } from "@/api/assessment";
  6. import dayjs from "dayjs";
  7. import { postAddAssessment, updateAssessment } from "@/api/assessment";
  8. import { postListTreeWithUser } from "@/api/department";
  9. import { getTemplateInfoList } from "@/api/templateInfo";
  10. import ElPicker from "@/components/ELPicker/index.vue";
  11. // 人员,医疗组,负责人
  12. import {
  13. postUserList,
  14. postOrganizationUserPage,
  15. getLeaderList
  16. } from "@/api/userSetting";
  17. const $emit = defineEmits(["addHandClick"]);
  18. const $props = defineProps({
  19. id: {
  20. type: String
  21. }
  22. });
  23. const params = reactive({
  24. id: $props.id
  25. });
  26. const dialogVisibleAdd = ref(false);
  27. const btn = ref(true);
  28. const btnShow = () => {
  29. btn.value = false;
  30. };
  31. // 季度 半年
  32. const ElPickerRef = ref();
  33. const form = reactive({
  34. name: "",
  35. cycle: "月度",
  36. cycleValue: "",
  37. assessmentType: null,
  38. assessmentObjectList: [
  39. {
  40. assessmentObjectId: "",
  41. assessmentObjectName: "",
  42. assessmentModelId: "",
  43. assessmentModelName: ""
  44. }
  45. ]
  46. });
  47. const rules = reactive({
  48. name: [{ required: true, message: "请填写名称", trigger: "blur" }]
  49. });
  50. const formLeftRules = reactive({
  51. left: [{ required: true, message: "请选择考核指标", trigger: "blur" }],
  52. value: [{ required: true, message: "请选择被考核对象", trigger: "blur" }]
  53. });
  54. const formRightRules = reactive({
  55. left: [{ required: true, message: "请选择考核指标", trigger: "blur" }],
  56. right: [{ required: true, message: "请选择考核模板", trigger: "blur" }]
  57. });
  58. const handleClose = () => {
  59. btn.value = true;
  60. };
  61. // 添加部门保存
  62. const saveDepartment = async () => {
  63. updateAssessmentApi();
  64. };
  65. const addNew = () => {
  66. form.assessmentObjectList.push({
  67. assessmentObjectId: "",
  68. assessmentObjectName: "",
  69. assessmentModelId: "",
  70. assessmentModelName: ""
  71. });
  72. // form.assessmentObjectList.left.push({ value: "" });
  73. };
  74. const deleteItem = (index: any) => {
  75. form.assessmentObjectList.splice(index, 1);
  76. // form.assessmentObjectList.right.splice(index, 1);
  77. };
  78. // 单选
  79. const timeType = ref<any>("月度");
  80. const quarterValue = ref(true);
  81. const format = ref<any>("YYYY-MM");
  82. const pickerType = ref<any>("month");
  83. const handleRegionChange = (value: any) => {
  84. timeType.value = value;
  85. switch (value) {
  86. case "年度":
  87. format.value = "YYYY";
  88. pickerType.value = "year";
  89. break;
  90. case "月度":
  91. format.value = "YYYY-MM";
  92. pickerType.value = "month";
  93. break;
  94. case "日期":
  95. format.value = "YYYY-MM-DD";
  96. pickerType.value = "";
  97. break;
  98. case "季度":
  99. quarterValue.value = true;
  100. break;
  101. case "半年":
  102. quarterValue.value = false;
  103. break;
  104. }
  105. };
  106. const yearTime = ref<any>(dayjs(new Date()).format("YYYY"));
  107. const decreaseYear = () => {
  108. yearTime.value = dayjs().year(yearTime.value).subtract(1, "year").year(); // 减一年
  109. };
  110. const increaseYear = () => {
  111. yearTime.value = dayjs().year(yearTime.value).add(1, "year").year(); // 加一年
  112. };
  113. const monthOne = item => {
  114. let start = "";
  115. let end = "";
  116. switch (item) {
  117. case "一季度":
  118. start = `${yearTime.value}-01-01`;
  119. end = `${yearTime.value}-03-31`;
  120. break;
  121. case "二季度":
  122. start = `${yearTime.value}-04-01`;
  123. end = `${yearTime.value}-06-30`;
  124. break;
  125. case "三季度":
  126. start = `${yearTime.value}-07-01`;
  127. end = `${yearTime.value}-09-30`;
  128. break;
  129. case "四季度":
  130. start = `${yearTime.value}-10-01`;
  131. end = `${yearTime.value}-12-31`;
  132. break;
  133. case "上半年":
  134. start = `${yearTime.value}-01-01`;
  135. end = `${yearTime.value}-06-30`;
  136. break;
  137. case "下半年":
  138. start = `${yearTime.value}-07-01`;
  139. end = `${yearTime.value}-12-31`;
  140. break;
  141. }
  142. form.cycleValue = `${yearTime.value}年${item}`;
  143. // return `从 ${start} 到 ${end}`; // 设置时间区间
  144. };
  145. // 部门人员与考核模板数据
  146. const treeDept = ref([]);
  147. const templateparams = reactive({
  148. page: 1,
  149. pageSize: 100
  150. });
  151. const resTmp = ref([]);
  152. const postListTreeWithUserApi = async () => {
  153. const res = await postListTreeWithUser();
  154. const { data, code } = await getTemplateInfoList(templateparams);
  155. resTmp.value = data.records;
  156. treeDept.value = [];
  157. treeDept.value = transformData(res.data);
  158. };
  159. const treeDept_person = ref([]);
  160. const transformData_person = (
  161. data,
  162. newDeptCodeKey = "userCodeNew",
  163. newDeptNameKey = "userNameNew"
  164. ) => {
  165. return data.map(item => {
  166. const newItem = { ...item };
  167. newItem.children = [
  168. ...(newItem.childrenUserRes || []).map(child => ({
  169. ...child
  170. }))
  171. ];
  172. delete newItem.childrenUserRes;
  173. delete newItem.childrenRes;
  174. // 重命名属性
  175. newItem.children = newItem.children.map(child => {
  176. const newChild = { ...child };
  177. newChild.userNameNew = child.realName;
  178. newChild.userCodeNew = child.userCode;
  179. return newChild;
  180. });
  181. // 递归处理子节点
  182. if (newItem.children && newItem.children.length) {
  183. newItem.children = transformData_person(
  184. newItem.children,
  185. newDeptCodeKey,
  186. newDeptNameKey
  187. );
  188. }
  189. return newItem;
  190. });
  191. };
  192. // 获取人员的数据
  193. const getPersonList = async () => {
  194. const res = await postListTreeWithUser();
  195. let treeList = res.data.map(item => {
  196. return {
  197. childrenRes: item.childrenRes,
  198. childrenUserRes: item.childrenUserRes,
  199. userCodeNew: item.deptCode,
  200. userNameNew: item.deptName
  201. };
  202. });
  203. treeDept_person.value = transformData_person(treeList);
  204. console.log(treeDept_person.value, "人员获取的值");
  205. };
  206. postListTreeWithUserApi();
  207. function transformData(arr) {
  208. return arr.map(item => {
  209. const {
  210. deptName: userName,
  211. deptCode: userCode,
  212. childrenRes,
  213. ...rest
  214. } = item;
  215. return {
  216. userName,
  217. userCode,
  218. childrenRes: childrenRes ? transformData(childrenRes) : [],
  219. ...rest
  220. };
  221. });
  222. }
  223. // 详情
  224. const treeDeptList = ref([]);
  225. const getAssessmentDetailsApi = async () => {
  226. const { data, code, msg } = await getAssessmentDetails({ id: params.id });
  227. if (code === 200) {
  228. Object.assign(form, data);
  229. console.log(form, "获取的值");
  230. if (form.assessmentType === 1) {
  231. postListTreeWithUserApi();
  232. } else if (form.assessmentType === 0) {
  233. getPersonList();
  234. } else if (form.assessmentType === 2) {
  235. const yiliao = await postOrganizationUserPage({
  236. organizationType: "group",
  237. pageNumber: 1,
  238. pageSize: 1000
  239. });
  240. treeDeptList.value = yiliao.data.records;
  241. console.log("获取的医疗组的值", treeDeptList.value);
  242. }
  243. } else {
  244. ElMessage.error(msg);
  245. }
  246. };
  247. getAssessmentDetailsApi();
  248. // 修改
  249. const updateAssessmentApi = async () => {
  250. const { code, msg } = await updateAssessment({ id: params.id, ...form });
  251. if (code === 200) {
  252. btn.value = true;
  253. ElMessage.success("修改成功");
  254. } else {
  255. ElMessage.error(msg);
  256. }
  257. };
  258. onMounted(() => {
  259. console.log("onMountedsdada", $props.id);
  260. });
  261. </script>
  262. <template>
  263. <div class="w-[500px] m-auto">
  264. <el-form
  265. :model="form"
  266. label-width="auto"
  267. style="max-width: 600px"
  268. :rules="rules"
  269. label-position="top"
  270. >
  271. <el-form-item label="考核名称" prop="name">
  272. <el-input v-model="form.name" :disabled="btn" placeholder="请输入" />
  273. </el-form-item>
  274. <el-form-item label="考核周期">
  275. <el-radio-group
  276. v-model="form.cycle"
  277. disabled
  278. @change="handleRegionChange"
  279. >
  280. <el-radio value="月度" size="large">月度</el-radio>
  281. <el-radio value="季度" size="large">季度</el-radio>
  282. <el-radio value="半年" size="large">半年</el-radio>
  283. <el-radio value="年度" size="large">年度</el-radio>
  284. <el-radio value="日期" size="large">日期</el-radio>
  285. </el-radio-group>
  286. <el-date-picker
  287. v-if="
  288. timeType === '月度' || timeType === '日期' || timeType === '年度'
  289. "
  290. v-model="form.cycleValue"
  291. disabled
  292. :type="pickerType"
  293. :format="format"
  294. placeholder="请选择"
  295. />
  296. <el-dropdown
  297. v-else-if="timeType === '季度' || timeType === '半年'"
  298. trigger="click"
  299. >
  300. <span class="el-dropdown-link navbar-bg-hover select-none">
  301. <el-input
  302. v-model="form.cycleValue"
  303. style="width: 240px"
  304. placeholder="请选择"
  305. :prefix-icon="Calendar"
  306. disabled
  307. />
  308. </span>
  309. <template #dropdown>
  310. <el-dropdown-menu class="setting" style="width: 300px">
  311. <div class="flex justify-between align-center text-base mt-4">
  312. <div
  313. class="cursor-pointer ml-4 text-xs pt-2"
  314. @click="decreaseYear"
  315. >
  316. <el-icon>
  317. <DArrowLeft />
  318. </el-icon>
  319. </div>
  320. <div>{{ yearTime }}</div>
  321. <div
  322. class="cursor-pointer mr-4 text-xs pt-2"
  323. @click="increaseYear"
  324. >
  325. <el-icon>
  326. <DArrowRight />
  327. </el-icon>
  328. </div>
  329. </div>
  330. <div
  331. v-if="quarterValue"
  332. class="flex justify-center align-center mt-5 mb-5"
  333. >
  334. <el-dropdown-item @click="monthOne('一季度')">
  335. 一季度
  336. </el-dropdown-item>
  337. <el-dropdown-item @click="monthOne('二季度')">
  338. 二季度
  339. </el-dropdown-item>
  340. <el-dropdown-item @click="monthOne('三季度')">
  341. 三季度
  342. </el-dropdown-item>
  343. <el-dropdown-item @click="monthOne('四季度')">
  344. 四季度
  345. </el-dropdown-item>
  346. </div>
  347. <div v-else class="flex justify-around align-center mt-5 mb-5">
  348. <el-dropdown-item @click="monthOne('上半年')">
  349. 上半年
  350. </el-dropdown-item>
  351. <el-dropdown-item @click="monthOne('下半年')">
  352. 下半年
  353. </el-dropdown-item>
  354. </div>
  355. </el-dropdown-menu>
  356. </template>
  357. </el-dropdown>
  358. </el-form-item>
  359. <el-form-item label="被考核类型">
  360. <el-select
  361. v-model="form.assessmentType"
  362. placeholder="请选择被考核类型"
  363. disabled
  364. >
  365. <el-option label="员工" :value="0" />
  366. <el-option label="部门" :value="1" />
  367. <el-option label="医疗" :value="2" />
  368. <el-option label="部门负责人" :value="3" />
  369. </el-select>
  370. </el-form-item>
  371. <el-form-item
  372. label="被考核对象与模板设置"
  373. prop="form1"
  374. label-position="top"
  375. >
  376. <div class="w-full flex">
  377. <div class="w-1/3">
  378. <el-form
  379. label-position="top"
  380. :model="form.assessmentObjectList"
  381. :rules="formLeftRules"
  382. >
  383. <el-form-item label="被考核对象" prop="left">
  384. <div
  385. v-for="(item, index) in form.assessmentObjectList"
  386. :key="index"
  387. class="w-full mt-1"
  388. >
  389. <el-tree-select
  390. v-if="form.assessmentType === 1"
  391. v-model="item.assessmentObjectId"
  392. :data="treeDept"
  393. :render-after-expand="false"
  394. show-checkbox
  395. disabled
  396. :props="{
  397. label: 'userName',
  398. value: 'userCode',
  399. children: 'childrenRes'
  400. }"
  401. style="width: 180px"
  402. />
  403. <!-- 员工多个 -->
  404. <el-tree-select
  405. v-if="form.assessmentType === 0"
  406. v-model="item.assessmentObjectId"
  407. :data="treeDept_person"
  408. :render-after-expand="false"
  409. show-checkbox
  410. disabled
  411. style="width: 180px"
  412. :props="{
  413. label: 'userNameNew',
  414. value: 'userCodeNew',
  415. children: 'children'
  416. }"
  417. />
  418. <!-- 医疗组,负责人 -->
  419. <el-select
  420. v-if="form.assessmentType != 0 && form.assessmentType != 1"
  421. v-model="item.assessmentObjectId"
  422. disabled
  423. >
  424. <el-option
  425. v-for="(it, id) in treeDeptList"
  426. :key="id"
  427. :label="it.realName"
  428. :value="it.userCode"
  429. />
  430. </el-select>
  431. </div>
  432. </el-form-item>
  433. </el-form>
  434. </div>
  435. <div class="w-1/2 ml-7">
  436. <el-form
  437. label-position="top"
  438. :model="form.assessmentObjectList"
  439. :rules="formRightRules"
  440. >
  441. <el-form-item label="考核模板" prop="right">
  442. <div
  443. v-for="(item, index) in form.assessmentObjectList"
  444. :key="index"
  445. class="w-full flex mt-1"
  446. >
  447. <el-select
  448. v-model="item.assessmentModelId"
  449. disabled
  450. placeholder="请选择"
  451. filterable
  452. style="width: 180px"
  453. >
  454. <el-option
  455. v-for="itemTmp in resTmp"
  456. :key="itemTmp.id"
  457. :label="itemTmp.tpName"
  458. :value="itemTmp.id"
  459. />
  460. </el-select>
  461. </div>
  462. </el-form-item>
  463. </el-form>
  464. </div>
  465. </div>
  466. </el-form-item>
  467. </el-form>
  468. <el-button
  469. v-if="btn"
  470. class="float-right mt-4"
  471. type="warning"
  472. @click="btnShow"
  473. >编辑</el-button
  474. >
  475. <div v-else class="float-right mt-4">
  476. <el-button @click="handleClose">取消</el-button>
  477. <el-button type="primary" @click="saveDepartment"> 确认 </el-button>
  478. </div>
  479. </div>
  480. </template>