manageObject.vue 57 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145114611471148114911501151115211531154115511561157115811591160116111621163116411651166116711681169117011711172117311741175117611771178117911801181118211831184118511861187118811891190119111921193119411951196119711981199120012011202120312041205120612071208120912101211121212131214121512161217121812191220122112221223122412251226122712281229123012311232123312341235123612371238123912401241124212431244124512461247124812491250125112521253125412551256125712581259126012611262126312641265126612671268126912701271127212731274127512761277127812791280128112821283128412851286128712881289129012911292129312941295129612971298129913001301130213031304130513061307130813091310131113121313131413151316131713181319132013211322132313241325132613271328132913301331133213331334133513361337133813391340134113421343134413451346134713481349135013511352135313541355135613571358135913601361136213631364136513661367136813691370137113721373137413751376137713781379138013811382138313841385138613871388138913901391139213931394139513961397139813991400140114021403140414051406140714081409141014111412141314141415141614171418141914201421142214231424142514261427142814291430143114321433143414351436143714381439144014411442144314441445144614471448144914501451145214531454145514561457145814591460146114621463146414651466146714681469147014711472147314741475147614771478147914801481148214831484148514861487148814891490149114921493149414951496149714981499150015011502150315041505150615071508150915101511151215131514151515161517151815191520152115221523152415251526152715281529153015311532153315341535153615371538153915401541154215431544154515461547154815491550155115521553155415551556155715581559156015611562156315641565156615671568156915701571157215731574157515761577157815791580158115821583158415851586158715881589159015911592159315941595159615971598159916001601160216031604160516061607160816091610161116121613161416151616161716181619162016211622162316241625162616271628162916301631163216331634163516361637163816391640164116421643164416451646164716481649165016511652165316541655165616571658165916601661166216631664166516661667166816691670167116721673167416751676167716781679168016811682168316841685168616871688168916901691169216931694169516961697169816991700170117021703170417051706170717081709171017111712171317141715171617171718171917201721172217231724172517261727172817291730173117321733173417351736173717381739174017411742174317441745174617471748174917501751175217531754175517561757175817591760176117621763176417651766176717681769177017711772177317741775177617771778177917801781178217831784178517861787178817891790179117921793179417951796179717981799180018011802180318041805180618071808180918101811181218131814181518161817181818191820182118221823182418251826182718281829183018311832183318341835183618371838183918401841184218431844184518461847184818491850185118521853185418551856185718581859186018611862186318641865186618671868186918701871187218731874187518761877187818791880188118821883188418851886
  1. <script setup lang="ts">
  2. defineOptions({
  3. name: "evaluateChangeManageObject"
  4. });
  5. import { getState, getStateType, assessmentStatus } from "@/config/tag";
  6. import { ref, reactive, onMounted, watch, computed } from "vue";
  7. import {
  8. getAssessmentQuotaDetails,
  9. delAssessmentObject,
  10. getAssessmentObjectDetails,
  11. postAddAssessmentObject,
  12. updateAssessmentQuotaDetails,
  13. alterFinishValue,
  14. automaticCollection,
  15. setTableHeader,
  16. delBatchDelScoreInfoVO,
  17. getAssessmentDetails
  18. } from "@/api/assessment";
  19. import editIndex from "./editIndex.vue";
  20. import { getTemplateInfoList } from "@/api/templateInfo";
  21. import { useRouter } from "vue-router";
  22. import { ElMessage, ElMessageBox } from "element-plus";
  23. import {
  24. treeDept,
  25. postListTreeWithUserApi,
  26. postListTree
  27. } from "@/api/department";
  28. import { Search } from "@element-plus/icons-vue";
  29. import messagePerson from "./message.vue";
  30. import dayjs from "dayjs";
  31. // 人员,医疗组,负责人
  32. import {
  33. postUserList,
  34. postOrganizationUserPage,
  35. getLeaderList
  36. } from "@/api/userSetting";
  37. // 获取医疗组的数据
  38. import { postPageGroup } from "@/api/userGroup";
  39. const $props = defineProps({
  40. message: {
  41. type: Object
  42. }
  43. });
  44. const valSelection = ref(false);
  45. const messageData = ref({});
  46. const initParams = reactive({
  47. params: {
  48. pageNumber: 1,
  49. pageSize: 10,
  50. userName: "",
  51. modelName: "",
  52. quotaName: "",
  53. assessmentId: "",
  54. orderField: "",
  55. orderType: ""
  56. },
  57. objParams: {
  58. pageNumber: 1,
  59. pageSize: 10,
  60. userName: "",
  61. modelName: "",
  62. quotaName: "",
  63. assessmentId: "",
  64. orderField: "",
  65. orderType: ""
  66. },
  67. indexParams: {
  68. pageNumber: 1,
  69. pageSize: 10,
  70. userName: "",
  71. modelName: "",
  72. quotaName: "",
  73. assessmentId: "",
  74. orderField: "",
  75. orderType: ""
  76. },
  77. tmpParams: {
  78. page: 1,
  79. pageSize: 100
  80. },
  81. total: 0,
  82. total1: 0,
  83. list: [],
  84. Indexlist: [],
  85. tmpList: []
  86. });
  87. const state = reactive({
  88. tableType: 0
  89. });
  90. // 转换函数 --- 人员
  91. const convertDepartmentDataRecursive_Person = data => {
  92. return data.map(department => {
  93. const { userNameNew, userCodeNew, children } = department;
  94. return {
  95. value: userCodeNew,
  96. label: userNameNew,
  97. children:
  98. children.length > 0
  99. ? children.map(
  100. child => convertDepartmentDataRecursive_Person([child])[0]
  101. )
  102. : []
  103. };
  104. });
  105. };
  106. // 转换函数 --- 部门
  107. const convertDepartmentDataRecursive = data => {
  108. return data.map(department => {
  109. const { deptCode, deptName, childrenRes } = department;
  110. return {
  111. value: deptCode,
  112. label: deptName,
  113. children:
  114. childrenRes.length > 0
  115. ? childrenRes.map(child => convertDepartmentDataRecursive([child])[0])
  116. : []
  117. };
  118. });
  119. };
  120. const dpetTree = ref([]);
  121. onMounted(async () => {
  122. Object.assign(messageData.value, $props.message);
  123. console.log("传递的值", $props.message);
  124. switch (messageData.value.assessmentType) {
  125. case 0:
  126. initParams.assessmentType = "员工";
  127. break;
  128. case 1:
  129. initParams.assessmentType = "部门";
  130. break;
  131. case 2:
  132. initParams.assessmentType = "医疗组";
  133. break;
  134. case 3:
  135. initParams.assessmentType = "员工";
  136. }
  137. assessmentTypeApi(messageData.value.assessmentType);
  138. initParams.params.assessmentId = $props.message.id;
  139. initParams.objParams.assessmentId = $props.message.id;
  140. initParams.indexParams.assessmentId = $props.message.id;
  141. state.tableType = $props.message.assessmentType;
  142. await getAssessmentQuotaDetailsApi();
  143. await getTemplateInfoListApi();
  144. await getAssessmentObjectDetailsApi();
  145. });
  146. const treeDeptList = ref([]);
  147. const assessmentTypeApi = async value => {
  148. switch (value) {
  149. case 0:
  150. postListTreeWithUserApi();
  151. break;
  152. case 1:
  153. const { data, code } = await postListTree();
  154. dpetTree.value = convertDepartmentDataRecursive(data);
  155. break;
  156. case 2:
  157. const yiliao = await postPageGroup({
  158. pageNumber: 1,
  159. pageSize: 1000
  160. });
  161. treeDeptList.value = yiliao.data.records;
  162. break;
  163. case 3:
  164. const fuzhere = await getLeaderList({ type: "dept" });
  165. console.log(fuzhere);
  166. treeDeptList.value = fuzhere.data;
  167. }
  168. };
  169. // 查询考核信息详情(考核指标)前先调用此接口,插入类型是自动采集的完成值
  170. const alterFinishValueApi = async () => {
  171. const { code, msg } = await alterFinishValue(initParams.indexParams);
  172. if (code != 200) {
  173. // ElMessage.error(msg);
  174. }
  175. };
  176. // 指标分页查询
  177. const getAssessmentQuotaDetailsApi = async () => {
  178. const res = await getAssessmentQuotaDetails(initParams.indexParams);
  179. if (res.code === 200) {
  180. console.log("指标分页查询", res);
  181. initParams.Indexlist = res.data.records;
  182. initParams.total1 = res.data.totalRow;
  183. alterFinishValueApi();
  184. getAssessmentDetailsApi(); // 获取考核指标详情表头信息
  185. }
  186. };
  187. // 考核模板
  188. const modulesList = ref([]);
  189. const getTemplateInfoListApi = async () => {
  190. const { data, code } = await getTemplateInfoList({
  191. page: 1,
  192. pageSize: 100
  193. });
  194. if (code == 200) {
  195. modulesList.value = data.records || [];
  196. }
  197. };
  198. const modulesValue = ref("");
  199. const handleModulesSelect = val => {
  200. addPersonParams.assessmentModelId = val;
  201. modulesList.value.forEach(el => {
  202. if (el.id === val) {
  203. addPersonParams.assessmentModelName = el.tpName;
  204. }
  205. });
  206. };
  207. // 删除
  208. const delParams = reactive({
  209. assessmentId: "",
  210. objectAddVoList: []
  211. });
  212. // 被考核对象
  213. const addPersonParams = reactive({
  214. assessmentId: "",
  215. objectAddVoList: [],
  216. assessmentModelId: "",
  217. assessmentModelName: ""
  218. });
  219. // 添加被考核人
  220. const value1 = ref();
  221. const delAssessmentObjectApi = async () => {
  222. if (valSelection.value) {
  223. ElMessageBox.confirm(
  224. "该员工考核删除后不可恢复,请谨慎操作!",
  225. "确定删除该员工考核吗?",
  226. {
  227. confirmButtonText: "确定",
  228. cancelButtonText: "取消",
  229. type: "warning"
  230. }
  231. ).then(async () => {
  232. const { code, msg } = await delAssessmentObject(delParams);
  233. if (code === 200) {
  234. getAssessmentObjectDetailsApi();
  235. ElMessage.success("删除成功");
  236. } else {
  237. ElMessage.error(msg);
  238. }
  239. });
  240. } else {
  241. ElMessage.warning("请选择要删除的考核对象");
  242. }
  243. };
  244. // 批量选中
  245. const changeSelection = val => {
  246. if (val) {
  247. valSelection.value = true;
  248. delParams.objectAddVoList = [];
  249. delParams.assessmentId = messageData.value.id;
  250. addPersonParams.assessmentId = messageData.value.id;
  251. let assessmentObjectId;
  252. let assessmentObjectName;
  253. val.forEach((item, index) => {
  254. const obj = {
  255. assessmentObjectId: item.assessmentObjectId,
  256. assessmentObjectName: item.assessmentObjectName
  257. };
  258. // delParams.objectAddVoList.forEach((item1, index1) => {
  259. // if (index == index1) {
  260. // assessmentObjectId = item.assessmentObjectId;
  261. // assessmentObjectName = item.assessmentObjectName;
  262. delParams.objectAddVoList.push(obj);
  263. // }
  264. // });
  265. });
  266. }
  267. };
  268. const router = useRouter();
  269. const activeName = ref("first");
  270. // 批量导入
  271. const addsImport = () => {
  272. router.push({ name: "importIndex", query: { ...messageData.value } });
  273. };
  274. const publishShow = ref(true);
  275. const publish = () => {
  276. publishShow.value = false;
  277. ElMessage({
  278. message: "成功",
  279. type: "success"
  280. });
  281. };
  282. // 添加被考核人
  283. const dialogVisibleAdd = ref(false);
  284. const assessmentTypeRef = ref();
  285. const transformArrayFormat = data => {
  286. return data.assessmentObjectId
  287. ?.map((item, index) => {
  288. return {
  289. assessmentObjectId: item,
  290. assessmentObjectName: data.assessmentObjectName[index]
  291. };
  292. })
  293. .flat();
  294. };
  295. // 人员 ---- 部门
  296. function flattenTree(data) {
  297. let result = [];
  298. for (const item of data) {
  299. // 添加当前节点到结果数组
  300. result.push({ value: item.value, label: item.label });
  301. // 如果有子节点,递归处理子节点
  302. if (item.children && item.children.length > 0) {
  303. result = result.concat(flattenTree(item.children));
  304. }
  305. }
  306. return result;
  307. }
  308. const handleNodeRreeSelect = data => {
  309. let dataList;
  310. console.log("data", data);
  311. if ($props.message.assessmentType == 1) {
  312. if (Array.isArray([data])) {
  313. dataList = flattenTree([data]);
  314. dataList.map(item => {
  315. addPersonParams?.objectAddVoList?.push({
  316. assessmentObjectId: item.value,
  317. assessmentObjectName: item.label
  318. });
  319. });
  320. }
  321. }
  322. };
  323. const handleRreeSelect = data => {
  324. const list = ref({});
  325. let dataList;
  326. // console.log("data", data);
  327. if ($props.message.assessmentType == 0) {
  328. if (Array.isArray(data)) {
  329. dataList = flattenTree(data);
  330. dataList.map(item => {
  331. if (item.value.substring(0, 4) == "user") {
  332. addPersonParams.objectAddVoList.push({
  333. assessmentObjectId: item.value,
  334. assessmentObjectName: item.label
  335. });
  336. }
  337. });
  338. } else {
  339. addPersonParams?.objectAddVoList?.push({
  340. assessmentObjectId: data.value,
  341. assessmentObjectName: data.label
  342. });
  343. }
  344. }
  345. const arr = assessmentTypeRef.value.getCheckedNodes().filter(item => {
  346. return item.children.length == 0;
  347. });
  348. list.value.assessmentObjectId = arr.map(item => item.value);
  349. list.value.assessmentObjectName = arr.map(item => item.label);
  350. // addPersonParams.objectAddVoList = transformArrayFormat(list);
  351. };
  352. // 医疗 --- 医疗主任
  353. const handChange = data => {
  354. console.log("data", data);
  355. let gropList = [];
  356. treeDeptList.value.map(it => {
  357. data.map(id => {
  358. if ($props.message.assessmentType == 2) {
  359. if (it.groupCode == id) {
  360. gropList.push({
  361. assessmentObjectId: it.groupCode,
  362. assessmentObjectName: it.groupName
  363. });
  364. }
  365. }
  366. if ($props.message.assessmentType == 3) {
  367. if (it.userCode == id) {
  368. gropList.push({
  369. assessmentObjectId: it.userCode,
  370. assessmentObjectName: it.realName
  371. });
  372. }
  373. }
  374. addPersonParams.objectAddVoList = gropList;
  375. });
  376. });
  377. const list = ref({});
  378. const arr = treeDeptList.value.filter(item => {
  379. return value1.value.includes(item.groupCode);
  380. });
  381. list.value.assessmentObjectId = arr.map(item => item.groupCode);
  382. list.value.assessmentObjectName = arr.map(item => item.groupName);
  383. // addPersonParams.objectAddVoList = transformArrayFormat(list);
  384. };
  385. const dialogVisibleAddShow = () => {
  386. dialogVisibleAdd.value = true;
  387. };
  388. // 跳转对应科室
  389. const GoView = row => {
  390. console.log(row, "路由跳转信息展示", messageData.value);
  391. const arr = {
  392. "0": "/draw/children/worker/workerDrak",
  393. "1": "/draw/children/department/departmentDrank",
  394. "2": "/draw/children/health/healthDrank",
  395. "3": "/draw/children/head/headDrank"
  396. };
  397. for (let key in arr) {
  398. if ($props.message.assessmentType == key) {
  399. router.push({
  400. path: arr[key],
  401. query: {
  402. assessmentId: messageData.value.id,
  403. assessmentModelId: row.assessmentModelId,
  404. assessmentObjectId: row.assessmentObjectId,
  405. assessmentName: row.assessmentModelName,
  406. assessmentModelName: row.assessmentModelName,
  407. // assessmentName: messageData.value.name,
  408. assessmentObjectName: row.assessmentObjectName
  409. }
  410. });
  411. return;
  412. }
  413. }
  414. };
  415. // 考核对象
  416. const objList = ref([]);
  417. const getAssessmentObjectDetailsApi = async () => {
  418. const { data, msg, code } = await getAssessmentObjectDetails(
  419. initParams.objParams
  420. );
  421. const res = await getAssessmentObjectDetails({
  422. pageNumber: 1,
  423. pageSize: 1000,
  424. assessmentId: initParams.objParams.assessmentId
  425. });
  426. if (res.code == 200) {
  427. // initParams.tmpList = res.data.records;
  428. initParams.tmpList = Array.from(
  429. new Map(
  430. res.data.records.map(item => [item.assessmentModelId, item])
  431. ).values()
  432. );
  433. }
  434. if (code === 200) {
  435. objList.value = data.records;
  436. initParams.total = data.totalRow;
  437. }
  438. };
  439. const handleSizeChange = (val: number) => {
  440. initParams.objParams.pageSize = val;
  441. getAssessmentObjectDetailsApi();
  442. };
  443. const handleCurrentChange = (val: number) => {
  444. initParams.objParams.pageNumber = val;
  445. getAssessmentObjectDetailsApi();
  446. };
  447. // 指标
  448. const handleSizeIndexChange = (val: number) => {
  449. initParams.indexParams.pageSize = val;
  450. getAssessmentQuotaDetailsApi();
  451. };
  452. const handleCurrentIndexChange = (val: number) => {
  453. initParams.indexParams.pageNumber = val;
  454. getAssessmentQuotaDetailsApi();
  455. };
  456. // 指标修改
  457. const updateAssessmentQuotaDetailsApi = async row => {
  458. try {
  459. const { msg, code } = await updateAssessmentQuotaDetails({ ...row });
  460. Object.assign(editVxe, {
  461. relationId: null,
  462. startValue: null,
  463. finalValue: null,
  464. dataSource: null,
  465. score: null,
  466. assessmentObjectId: null,
  467. assessmentModelId: null,
  468. id: null,
  469. dimId: null,
  470. assessmentId: null
  471. });
  472. if (code === 200) {
  473. ElMessage.success("修改成功");
  474. getAssessmentQuotaDetailsApi();
  475. } else {
  476. getAssessmentQuotaDetailsApi();
  477. }
  478. } catch (error) {
  479. // ElMessage.error(error.response.data.msg);
  480. getAssessmentQuotaDetailsApi();
  481. }
  482. };
  483. const tableVxeRef = ref();
  484. const editConfig = ref({
  485. trigger: "click",
  486. mode: "cell",
  487. showStatus: true,
  488. beforeEditMethod({ row, column }) {
  489. console.log("编辑123212132", column.title);
  490. // 完成值 挑战值 门槛值 增幅 降幅 上期完成值 上上期完成值 得分
  491. if (
  492. column.title == "目标值" ||
  493. column.title == "挑战值" ||
  494. column.title == "门槛值"
  495. ) {
  496. return true;
  497. } else {
  498. if (row.valueInput == 4 || row.valueInput == "4") {
  499. return false;
  500. } else {
  501. return true;
  502. }
  503. }
  504. }
  505. });
  506. const editVxe = reactive({
  507. relationId: null,
  508. startValue: null,
  509. finalValue: null,
  510. dataSource: null,
  511. score: null,
  512. assessmentObjectId: null,
  513. assessmentModelId: null,
  514. id: null,
  515. dimId: null,
  516. addValue: null,
  517. decValue: null,
  518. challengeValue: null,
  519. upperValue: null,
  520. agupperValue: null,
  521. assessmentId: null
  522. });
  523. // 编辑前面
  524. const editOpenEvent = data => {
  525. console.log("editOpenEvent", data);
  526. };
  527. const hangdleOpenClick = row => {
  528. Object.assign(editVxe, {
  529. relationId: null,
  530. startValue: null,
  531. finalValue: null,
  532. dataSource: null,
  533. score: null,
  534. assessmentObjectId: null,
  535. assessmentModelId: null,
  536. addValue: null,
  537. decValue: null,
  538. challengeValue: null,
  539. upperValue: null,
  540. agupperValue: null,
  541. id: null,
  542. dimId: null,
  543. assessmentId: null
  544. });
  545. console.log("hangdleOpenClick", row);
  546. editVxe.finalValue = row?.finalValue;
  547. editVxe.score = row?.score;
  548. };
  549. const editClosedEvent = row => {
  550. // { row, column, newValue, oldValue }
  551. const $table = tableVxeRef.value;
  552. if ($table) {
  553. console.log(1433223, row.row);
  554. editVxe.relationId = row.row?.relationId;
  555. editVxe.assessmentModelId = row.row?.assessmentModelId;
  556. editVxe.assessmentObjectId = row.row?.assessmentObjectId;
  557. editVxe.id = row.row?.id;
  558. editVxe.dimId = row.row?.dimId;
  559. editVxe.assessmentId = messageData.value.id;
  560. // 判断表头
  561. if (row.column.title == "得分") {
  562. // 判断是否为空
  563. if (row.row?.score) {
  564. // 判断是否id相同
  565. if (editVxe.score != row.row?.score) {
  566. // if (row.row?.id != editVxe.id) {
  567. editVxe.score = convertToNumberIfPercentage(row.row?.score);
  568. editVxe.finalValue = null;
  569. editVxe.challengeValue = null;
  570. editVxe.startValue = null;
  571. editVxe.addValue = null;
  572. editVxe.decValue = null;
  573. editVxe.upperValue = null;
  574. editVxe.targetValue = null;
  575. editVxe.agupperValue = null;
  576. updateAssessmentQuotaDetailsApi(editVxe);
  577. // }
  578. }
  579. }
  580. }
  581. if (row.column.title == "完成值") {
  582. if (row.row?.finalValue) {
  583. // if (row.row?.id != editVxe.id) {
  584. if (editVxe.finalValue != row.row?.finalValue) {
  585. editVxe.finalValue = convertToNumberIfPercentage(row.row?.finalValue);
  586. editVxe.score = null;
  587. editVxe.challengeValue = null;
  588. editVxe.startValue = null;
  589. editVxe.addValue = null;
  590. editVxe.decValue = null;
  591. editVxe.upperValue = null;
  592. editVxe.targetValue = null;
  593. editVxe.agupperValue = null;
  594. updateAssessmentQuotaDetailsApi(editVxe);
  595. }
  596. // }
  597. }
  598. }
  599. if (row.column.title == "挑战值") {
  600. if (row.row?.challengeValue) {
  601. // if (row.row?.id != editVxe.id) {
  602. if (editVxe.challengeValue != row.row?.challengeValue) {
  603. editVxe.challengeValue = convertToNumberIfPercentage(
  604. row.row?.challengeValue
  605. );
  606. editVxe.score = null;
  607. editVxe.finalValue = null;
  608. editVxe.startValue = null;
  609. editVxe.addValue = null;
  610. editVxe.decValue = null;
  611. editVxe.upperValue = null;
  612. editVxe.targetValue = null;
  613. editVxe.agupperValue = null;
  614. updateAssessmentQuotaDetailsApi(editVxe);
  615. }
  616. // }
  617. }
  618. }
  619. if (row.column.title == "门槛值") {
  620. if (row.row?.startValue) {
  621. // if (row.row?.id != editVxe.id) {
  622. if (editVxe.startValue != row.row?.startValue) {
  623. editVxe.startValue = convertToNumberIfPercentage(row.row?.startValue);
  624. editVxe.score = null;
  625. editVxe.finalValue = null;
  626. editVxe.challengeValue = null;
  627. editVxe.addValue = null;
  628. editVxe.decValue = null;
  629. editVxe.upperValue = null;
  630. editVxe.targetValue = null;
  631. editVxe.agupperValue = null;
  632. updateAssessmentQuotaDetailsApi(editVxe);
  633. }
  634. // }
  635. }
  636. }
  637. if (row.column.title == "增幅") {
  638. if (row.row?.addValue) {
  639. if (editVxe.addValue != row.row?.addValue) {
  640. editVxe.addValue = convertToNumberIfPercentage(row.row?.addValue);
  641. editVxe.startValue = null;
  642. editVxe.score = null;
  643. editVxe.finalValue = null;
  644. editVxe.challengeValue = null;
  645. editVxe.decValue = null;
  646. editVxe.upperValue = null;
  647. editVxe.targetValue = null;
  648. editVxe.agupperValue = null;
  649. updateAssessmentQuotaDetailsApi(editVxe);
  650. }
  651. }
  652. }
  653. if (row.column.title == "降幅") {
  654. if (row.row?.decValue) {
  655. if (editVxe.decValue != row.row?.decValue) {
  656. editVxe.decValue = convertToNumberIfPercentage(row.row?.decValue);
  657. editVxe.startValue = null;
  658. editVxe.score = null;
  659. editVxe.finalValue = null;
  660. editVxe.challengeValue = null;
  661. editVxe.addValue = null;
  662. editVxe.upperValue = null;
  663. editVxe.agupperValue = null;
  664. editVxe.targetValue = null;
  665. updateAssessmentQuotaDetailsApi(editVxe);
  666. }
  667. }
  668. }
  669. if (row.column.title == "上期完成值") {
  670. if (row.row?.upperValue) {
  671. if (editVxe.upperValue != row.row?.upperValue) {
  672. editVxe.upperValue = convertToNumberIfPercentage(row.row?.upperValue);
  673. editVxe.startValue = null;
  674. editVxe.score = null;
  675. editVxe.finalValue = null;
  676. editVxe.challengeValue = null;
  677. editVxe.addValue = null;
  678. editVxe.decValue = null;
  679. editVxe.agupperValue = null;
  680. editVxe.targetValue = null;
  681. updateAssessmentQuotaDetailsApi(editVxe);
  682. }
  683. }
  684. }
  685. if (row.column.title == "上上期完成值") {
  686. if (row.row?.agupperValue) {
  687. if (editVxe.agupperValue != row.row?.agupperValue) {
  688. editVxe.agupperValue = convertToNumberIfPercentage(
  689. row.row?.agupperValue
  690. );
  691. editVxe.startValue = null;
  692. editVxe.score = null;
  693. editVxe.finalValue = null;
  694. editVxe.challengeValue = null;
  695. editVxe.addValue = null;
  696. editVxe.decValue = null;
  697. editVxe.upperValue = null;
  698. editVxe.targetValue = null;
  699. updateAssessmentQuotaDetailsApi(editVxe);
  700. }
  701. }
  702. }
  703. if (row.column.title == "目标值") {
  704. if (row.row?.targetValue) {
  705. if (editVxe.targetValue != row.row?.targetValue) {
  706. editVxe.targetValue = convertToNumberIfPercentage(
  707. row.row?.targetValue
  708. );
  709. editVxe.startValue = null;
  710. editVxe.agupperValue = null;
  711. editVxe.score = null;
  712. editVxe.finalValue = null;
  713. editVxe.challengeValue = null;
  714. editVxe.addValue = null;
  715. editVxe.decValue = null;
  716. editVxe.upperValue = null;
  717. updateAssessmentQuotaDetailsApi(editVxe);
  718. }
  719. }
  720. }
  721. }
  722. };
  723. // 关闭弹窗
  724. const closePerson = () => {
  725. Object.assign(addPersonParams, {
  726. assessmentId: "",
  727. objectAddVoList: [],
  728. assessmentModelId: "",
  729. assessmentModelName: ""
  730. });
  731. value1.value = [];
  732. modulesValue.value = "";
  733. dialogVisibleAdd.value = false;
  734. };
  735. // 添加被考核人
  736. const addPerson = async () => {
  737. addPersonParams.assessmentId = $props.message.id;
  738. let arr = [];
  739. if ($props.message.assessmentType == 0) {
  740. addPersonParams.objectAddVoList.map(it => {
  741. if (it.assessmentObjectId.substring(0, 4) == "user") {
  742. arr.push(it);
  743. }
  744. addPersonParams.objectAddVoList = arr;
  745. });
  746. }
  747. const { data, msg, code } = await postAddAssessmentObject(addPersonParams);
  748. if (code === 200) {
  749. ElMessage.success("添加成功");
  750. dialogVisibleAdd.value = false;
  751. getAssessmentObjectDetailsApi();
  752. closePerson();
  753. }
  754. };
  755. const changTitle = () => {
  756. const obj = {
  757. 0: "添加被考核人",
  758. 1: "添加被考核科室",
  759. 2: "添加被考核医疗组",
  760. 3: "添加被考核部门负责人"
  761. };
  762. return obj[$props.message.assessmentType];
  763. };
  764. const editDisabledEvent = ({}) => {};
  765. // 同步数据
  766. const automaticCollectionApi = async () => {
  767. const { code, msg } = await automaticCollection(initParams.indexParams);
  768. if (code === 200) {
  769. ElMessage.success("同步数据成功");
  770. } else {
  771. ElMessage.error(msg);
  772. }
  773. };
  774. const assessmentHeader = reactive({
  775. id: "",
  776. name: "",
  777. cycle: "",
  778. cycleValue: "",
  779. assessmentType: 0,
  780. assessmentStatus: 0,
  781. isDelete: 0,
  782. showTargetValue: 1,
  783. showChallengeValue: 0,
  784. showStartValue: 0,
  785. showAddValue: 0,
  786. showDecValue: 0,
  787. showUpperValue: 0,
  788. showAgupperValue: 0
  789. });
  790. const showAssessmentHeader = reactive({
  791. showTargetValue: 1,
  792. showChallengeValue: 0,
  793. showStartValue: 0,
  794. showAddValue: 0,
  795. showDecValue: 0,
  796. showUpperValue: 0,
  797. showAgupperValue: 0
  798. });
  799. // 开关状态
  800. // 目标值
  801. const showTargetValueSwitch = computed({
  802. get: () => assessmentHeader.showTargetValue === 1,
  803. set: value => {
  804. assessmentHeader.showTargetValue = value ? 1 : 0;
  805. }
  806. });
  807. // 挑战值
  808. const showChallengeValueSwitch = computed({
  809. get: () => assessmentHeader.showChallengeValue === 1,
  810. set: value => {
  811. assessmentHeader.showChallengeValue = value ? 1 : 0;
  812. }
  813. });
  814. // 门槛值
  815. const showStartValueSwitch = computed({
  816. get: () => assessmentHeader.showStartValue === 1,
  817. set: value => {
  818. assessmentHeader.showStartValue = value ? 1 : 0;
  819. }
  820. });
  821. // 增幅值
  822. const showAddValueSwitch = computed({
  823. get: () => assessmentHeader.showAddValue === 1,
  824. set: value => {
  825. assessmentHeader.showAddValue = value ? 1 : 0;
  826. }
  827. });
  828. // 降幅值
  829. const showDecValueSwitch = computed({
  830. get: () => assessmentHeader.showDecValue === 1,
  831. set: value => {
  832. assessmentHeader.showDecValue = value ? 1 : 0;
  833. }
  834. });
  835. // 上期数值
  836. const showUpperValueSwitch = computed({
  837. get: () => assessmentHeader.showUpperValue === 1,
  838. set: value => {
  839. assessmentHeader.showUpperValue = value ? 1 : 0;
  840. }
  841. });
  842. // 上上期值
  843. const showAgupperValueSwitch = computed({
  844. get: () => assessmentHeader.showAgupperValue === 1,
  845. set: value => {
  846. assessmentHeader.showAgupperValue = value ? 1 : 0;
  847. }
  848. });
  849. const setTableHeaderApi = async () => {
  850. Object.assign(assessmentHeader, {
  851. id: $props.message.id,
  852. name: $props.message.name,
  853. cycle: $props.message.cycle,
  854. cycleValue: $props.message.cycleValue,
  855. assessmentType: $props.message.assessmentType,
  856. assessmentStatus: $props.message.assessmentStatus
  857. });
  858. const { code, msg } = await setTableHeader(assessmentHeader);
  859. if (code === 200) {
  860. getAssessmentQuotaDetailsApi();
  861. let aa = JSON.parse(JSON.stringify(assessmentHeader));
  862. console.log("表头设置", aa);
  863. // 目标值
  864. aa.showTargetValue == 1
  865. ? showColEvent("targetValue")
  866. : hideColEvent("targetValue");
  867. // 挑战值
  868. aa.showChallengeValue == 1
  869. ? showColEvent("challengeValue")
  870. : hideColEvent("challengeValue");
  871. // 门槛值
  872. aa.showStartValue == 1
  873. ? showColEvent("startValue")
  874. : hideColEvent("startValue");
  875. // 增幅
  876. aa.showAddValue == 1 ? showColEvent("addValue") : hideColEvent("addValue");
  877. // 降幅
  878. aa.showDecValue == 1 ? showColEvent("decValue") : hideColEvent("decValue");
  879. // 上期完成值
  880. aa.showUpperValue == 1
  881. ? showColEvent("upperValue")
  882. : hideColEvent("upperValue");
  883. // 上上期完成值
  884. aa.showAgupperValue == 1
  885. ? showColEvent("agupperValue")
  886. : hideColEvent("agupperValue");
  887. Object.assign(showAssessmentHeader, aa);
  888. ElMessage.success("表头设置成功");
  889. } else {
  890. ElMessage.error(msg);
  891. }
  892. };
  893. const getAssessmentDetailsApi = async () => {
  894. const { code, data } = await getAssessmentDetails({
  895. id: messageData.value.id
  896. });
  897. if (code == 200) {
  898. assessmentHeader.showTargetValue = data.showTargetValue;
  899. assessmentHeader.showChallengeValue = data.showChallengeValue;
  900. assessmentHeader.showStartValue = data.showStartValue;
  901. assessmentHeader.showAddValue = data.showAddValue;
  902. assessmentHeader.showDecValue = data.showDecValue;
  903. assessmentHeader.showUpperValue = data.showUpperValue;
  904. assessmentHeader.showAgupperValue = data.showAgupperValue;
  905. let aa = JSON.parse(JSON.stringify(assessmentHeader));
  906. console.log(111111, aa);
  907. // 目标值
  908. aa.showTargetValue == 1
  909. ? showColEvent("targetValue")
  910. : hideColEvent("targetValue");
  911. // 挑战值
  912. aa.showChallengeValue == 1
  913. ? showColEvent("challengeValue")
  914. : hideColEvent("challengeValue");
  915. // 门槛值
  916. aa.showStartValue == 1
  917. ? showColEvent("startValue")
  918. : hideColEvent("startValue");
  919. // 增幅
  920. aa.showAddValue == 1 ? showColEvent("addValue") : hideColEvent("addValue");
  921. // 降幅
  922. aa.showDecValue == 1 ? showColEvent("decValue") : hideColEvent("decValue");
  923. // 上期完成值
  924. aa.showUpperValue == 1
  925. ? showColEvent("upperValue")
  926. : hideColEvent("upperValue");
  927. // 上上期完成值
  928. aa.showAgupperValue == 1
  929. ? showColEvent("agupperValue")
  930. : hideColEvent("agupperValue");
  931. Object.assign(showAssessmentHeader, aa);
  932. }
  933. };
  934. // 判断是否为百分数
  935. function convertToNumberIfPercentage(value) {
  936. // 判断是否为字符串,并且是否包含百分号
  937. if (typeof value === "string" && value.trim().endsWith("%")) {
  938. // 去掉百分号并将剩余的部分转换为数字
  939. const numberValue = parseFloat(value.slice(0, -1));
  940. // 如果转换后的值是有效的数字,返回数字形式
  941. if (!isNaN(numberValue)) {
  942. return numberValue / 100; // 转换为小数
  943. } else {
  944. return value; // 如果无法转换为有效数字,返回原值
  945. }
  946. }
  947. // 如果不是百分数,直接返回原值
  948. return value;
  949. }
  950. // 数据校验
  951. const validRules = ref({
  952. finalValue: [
  953. {
  954. validator: ({ cellValue }) => {
  955. const numberPattern = /^[0-9]+(\.[0-9]+)?$/; // 匹配数字或小数
  956. const decimalPattern = /^\d+(\.\d+)?$/; // 匹配小数
  957. const percentagePattern = /^([0-9]{1,2}|100)(\.[0-9]{1,2})?%$/; // 匹配百分数
  958. if (
  959. numberPattern.test(cellValue) ||
  960. decimalPattern.test(cellValue) ||
  961. percentagePattern.test(cellValue)
  962. ) {
  963. return; // 校验通过
  964. } else {
  965. cellValue = "";
  966. return new Error("请输入一个有效的数字、小数或百分数"); // 校验不通过
  967. }
  968. }
  969. }
  970. ],
  971. targetValue: [
  972. {
  973. validator: ({ cellValue }) => {
  974. const numberPattern = /^[0-9]+(\.[0-9]+)?$/; // 匹配数字或小数
  975. const decimalPattern = /^\d+(\.\d+)?$/; // 匹配小数
  976. const percentagePattern = /^([0-9]{1,2}|100)(\.[0-9]{1,2})?%$/; // 匹配百分数
  977. if (
  978. numberPattern.test(cellValue) ||
  979. decimalPattern.test(cellValue) ||
  980. percentagePattern.test(cellValue)
  981. ) {
  982. return; // 校验通过
  983. } else {
  984. cellValue = "";
  985. return new Error("请输入一个有效的数字、小数或百分数"); // 校验不通过
  986. }
  987. }
  988. }
  989. ],
  990. challengeValue: [
  991. {
  992. validator: ({ cellValue }) => {
  993. const numberPattern = /^[0-9]+(\.[0-9]+)?$/; // 匹配数字或小数
  994. const decimalPattern = /^\d+(\.\d+)?$/; // 匹配小数
  995. const percentagePattern = /^([0-9]{1,2}|100)(\.[0-9]{1,2})?%$/; // 匹配百分数
  996. if (
  997. numberPattern.test(cellValue) ||
  998. decimalPattern.test(cellValue) ||
  999. percentagePattern.test(cellValue)
  1000. ) {
  1001. return; // 校验通过
  1002. } else {
  1003. return new Error("请输入一个有效的数字、小数或百分数"); // 校验不通过
  1004. }
  1005. }
  1006. }
  1007. ],
  1008. startValue: [
  1009. {
  1010. validator: ({ cellValue }) => {
  1011. const numberPattern = /^[0-9]+(\.[0-9]+)?$/; // 匹配数字或小数
  1012. const decimalPattern = /^\d+(\.\d+)?$/; // 匹配小数
  1013. const percentagePattern = /^([0-9]{1,2}|100)(\.[0-9]{1,2})?%$/; // 匹配百分数
  1014. if (
  1015. numberPattern.test(cellValue) ||
  1016. decimalPattern.test(cellValue) ||
  1017. percentagePattern.test(cellValue)
  1018. ) {
  1019. return; // 校验通过
  1020. } else {
  1021. return new Error("请输入一个有效的数字、小数或百分数"); // 校验不通过
  1022. }
  1023. }
  1024. }
  1025. ],
  1026. addValue: [
  1027. {
  1028. validator: ({ cellValue }) => {
  1029. const numberPattern = /^[0-9]+(\.[0-9]+)?$/; // 匹配数字或小数
  1030. const decimalPattern = /^\d+(\.\d+)?$/; // 匹配小数
  1031. const percentagePattern = /^([0-9]{1,2}|100)(\.[0-9]{1,2})?%$/; // 匹配百分数
  1032. if (
  1033. numberPattern.test(cellValue) ||
  1034. decimalPattern.test(cellValue) ||
  1035. percentagePattern.test(cellValue)
  1036. ) {
  1037. return; // 校验通过
  1038. } else {
  1039. return new Error("请输入一个有效的数字、小数或百分数"); // 校验不通过
  1040. }
  1041. }
  1042. }
  1043. ],
  1044. decValue: [
  1045. {
  1046. validator: ({ cellValue }) => {
  1047. const numberPattern = /^[0-9]+(\.[0-9]+)?$/; // 匹配数字或小数
  1048. const decimalPattern = /^\d+(\.\d+)?$/; // 匹配小数
  1049. const percentagePattern = /^([0-9]{1,2}|100)(\.[0-9]{1,2})?%$/; // 匹配百分数
  1050. if (
  1051. numberPattern.test(cellValue) ||
  1052. decimalPattern.test(cellValue) ||
  1053. percentagePattern.test(cellValue)
  1054. ) {
  1055. return; // 校验通过
  1056. } else {
  1057. return new Error("请输入一个有效的数字、小数或百分数"); // 校验不通过
  1058. }
  1059. }
  1060. }
  1061. ],
  1062. upperValue: [
  1063. {
  1064. validator: ({ cellValue }) => {
  1065. const numberPattern = /^[0-9]+(\.[0-9]+)?$/; // 匹配数字或小数
  1066. const decimalPattern = /^\d+(\.\d+)?$/; // 匹配小数
  1067. const percentagePattern = /^([0-9]{1,2}|100)(\.[0-9]{1,2})?%$/; // 匹配百分数
  1068. if (
  1069. numberPattern.test(cellValue) ||
  1070. decimalPattern.test(cellValue) ||
  1071. percentagePattern.test(cellValue)
  1072. ) {
  1073. return; // 校验通过
  1074. } else {
  1075. return new Error("请输入一个有效的数字、小数或百分数"); // 校验不通过
  1076. }
  1077. }
  1078. }
  1079. ],
  1080. agupperValue: [
  1081. {
  1082. validator: ({ cellValue }) => {
  1083. const numberPattern = /^[0-9]+(\.[0-9]+)?$/; // 匹配数字或小数
  1084. const decimalPattern = /^\d+(\.\d+)?$/; // 匹配小数
  1085. const percentagePattern = /^([0-9]{1,2}|100)(\.[0-9]{1,2})?%$/; // 匹配百分数
  1086. if (
  1087. numberPattern.test(cellValue) ||
  1088. decimalPattern.test(cellValue) ||
  1089. percentagePattern.test(cellValue)
  1090. ) {
  1091. return; // 校验通过
  1092. } else {
  1093. return new Error("请输入一个有效的数字、小数或百分数"); // 校验不通过
  1094. }
  1095. }
  1096. }
  1097. ],
  1098. score: [
  1099. {
  1100. validator: ({ cellValue }) => {
  1101. const numberPattern = /^[0-9]+(\.[0-9]+)?$/; // 匹配数字或小数
  1102. const decimalPattern = /^\d+(\.\d+)?$/; // 匹配小数
  1103. const percentagePattern = /^([0-9]{1,2}|100)(\.[0-9]{1,2})?%$/; // 匹配百分数
  1104. if (numberPattern.test(cellValue) || decimalPattern.test(cellValue)) {
  1105. return;
  1106. } else {
  1107. return new Error("请输入一个有效的数字、小数"); // 校验不通过
  1108. }
  1109. }
  1110. }
  1111. ]
  1112. });
  1113. // 固定表头
  1114. // 计算列配置
  1115. const showColEvent = field => {
  1116. const $table = tableVxeRef.value;
  1117. if ($table) {
  1118. $table.showColumn(field);
  1119. }
  1120. };
  1121. const hideColEvent = field => {
  1122. const $table = tableVxeRef.value;
  1123. if ($table) {
  1124. $table.hideColumn(field);
  1125. }
  1126. };
  1127. const editIndexShow = ref(null);
  1128. const editIndexOpen = (row: Object) => {
  1129. editIndexShow.value.open({
  1130. ...row,
  1131. assessmentId: initParams.indexParams.assessmentId
  1132. });
  1133. };
  1134. const deleteParam = ref([]);
  1135. // 批量删除指标
  1136. const deleteMantList = () => {
  1137. if (deleteParam.value.length === 0) {
  1138. ElMessage.warning("请选择要删除的考核指标");
  1139. } else {
  1140. ElMessageBox.confirm(
  1141. "这些考核项删除后将不可恢复,请谨慎操作",
  1142. "确定删除这些考核项吗?",
  1143. {
  1144. confirmButtonText: "确定",
  1145. cancelButtonText: "取消",
  1146. type: "warning"
  1147. }
  1148. ).then(async () => {
  1149. deleteParam.value.map(item => {
  1150. item.assessmentId = initParams.indexParams.assessmentId;
  1151. });
  1152. const { code } = await delBatchDelScoreInfoVO(deleteParam.value);
  1153. if (code === 200) {
  1154. getAssessmentQuotaDetailsApi();
  1155. activeName.value = "second";
  1156. ElMessage({
  1157. type: "success",
  1158. message: "删除成功"
  1159. });
  1160. }
  1161. });
  1162. }
  1163. };
  1164. // 单选
  1165. const selectChangeEvent = row => {
  1166. const $table = tableVxeRef.value;
  1167. deleteParam.value = [];
  1168. if ($table) {
  1169. // deleteParam.value = row.records;
  1170. row.records.map(item => {
  1171. deleteParam.value.push({
  1172. assessmentObjectId: item.assessmentObjectId,
  1173. assessmentModelId: item.assessmentModelId,
  1174. assessmentId: item.assessmentId,
  1175. dimId: item.dimId,
  1176. indId: item.id
  1177. });
  1178. });
  1179. }
  1180. };
  1181. // 全选
  1182. const selectAllChangeEvent = row => {
  1183. const $table = tableVxeRef.value;
  1184. deleteParam.value = [];
  1185. if ($table) {
  1186. // deleteParam.value = row.records;
  1187. console.log(111111, row.records);
  1188. row.records.map(item => {
  1189. deleteParam.value.push({
  1190. assessmentObjectId: item.assessmentObjectId,
  1191. assessmentModelId: item.assessmentModelId,
  1192. assessmentId: item.assessmentId,
  1193. dimId: item.dimId,
  1194. indId: item.id
  1195. });
  1196. });
  1197. }
  1198. };
  1199. </script>
  1200. <template>
  1201. <div class="w-full">
  1202. <!-- 指标编辑 -->
  1203. <editIndex ref="editIndexShow" />
  1204. <div class="w-full flex items-center justify-between">
  1205. <div class="flex items-center justify-between mt-2">
  1206. <div class="bg-icon">
  1207. <div>
  1208. <el-icon>
  1209. <Tickets />
  1210. </el-icon>
  1211. </div>
  1212. </div>
  1213. <div>
  1214. <div class="flex items-center justify-between">
  1215. <h5>{{ messageData.name }}</h5>
  1216. <el-tag :type="getStateType(messageData.assessmentStatus)">
  1217. {{ assessmentStatus(messageData.assessmentStatus) }}
  1218. </el-tag>
  1219. </div>
  1220. <el-text type="info" class="text-xs">
  1221. {{ messageData.cycleValue }}
  1222. </el-text>
  1223. </div>
  1224. </div>
  1225. <div class="mr-10">
  1226. <Auth :value="['公布考核结果']">
  1227. <el-button v-if="publishShow" type="primary" @click="publish"
  1228. >公布考核结果</el-button
  1229. >
  1230. </Auth>
  1231. </div>
  1232. </div>
  1233. <el-tabs v-model="activeName" class="demo-tabs">
  1234. <el-tab-pane label="考核对象" name="first">
  1235. <div class="w-full flex items-center justify-between">
  1236. <div class="w-1/2 flex items-center justify-between">
  1237. <el-text class="w-1/5">考核模板</el-text>
  1238. <el-select
  1239. v-model="initParams.objParams.modelName"
  1240. placeholder="请选择"
  1241. filterable
  1242. clearable
  1243. style="width: 250px"
  1244. @change="getAssessmentObjectDetailsApi"
  1245. >
  1246. <el-option
  1247. v-for="itemTmp in initParams.tmpList"
  1248. :key="itemTmp.id"
  1249. :label="itemTmp.assessmentModelName"
  1250. :value="itemTmp.assessmentModelName"
  1251. />
  1252. </el-select>
  1253. <el-input
  1254. v-model="initParams.objParams.userName"
  1255. class="ml-2"
  1256. clearable
  1257. placeholder="搜索"
  1258. :prefix-icon="Search"
  1259. @change="getAssessmentObjectDetailsApi"
  1260. />
  1261. </div>
  1262. <div class="mr-10">
  1263. <!-- <el-button type="primary" plain>批量调整执行人</el-button>
  1264. <el-button type="primary" plain>批量重置流程</el-button> -->
  1265. <Auth :value="['批量删除']">
  1266. <el-button type="primary" plain @click="delAssessmentObjectApi">
  1267. 批量删除
  1268. </el-button>
  1269. </Auth>
  1270. <Auth :value="['添加被考核人']">
  1271. <el-button type="primary" plain @click="dialogVisibleAddShow">{{
  1272. changTitle()
  1273. }}</el-button>
  1274. </Auth>
  1275. </div>
  1276. </div>
  1277. <el-table
  1278. :data="objList"
  1279. style="width: 100%"
  1280. @selection-change="changeSelection"
  1281. >
  1282. <el-table-column type="selection" width="55" />
  1283. <el-table-column
  1284. v-if="state.tableType == 0 || state.tableType == 3"
  1285. prop="realName"
  1286. label="人员"
  1287. width="100"
  1288. />
  1289. <el-table-column
  1290. v-if="state.tableType == 2"
  1291. prop="assessmentObjectName"
  1292. label="医疗组"
  1293. width="100"
  1294. />
  1295. <el-table-column
  1296. v-if="state.tableType == 0 || state.tableType == 3"
  1297. prop="userName"
  1298. label="工号"
  1299. width="180"
  1300. />
  1301. <el-table-column
  1302. v-if="state.tableType != 2"
  1303. prop="deptName"
  1304. label="科室"
  1305. width="180"
  1306. />
  1307. <el-table-column
  1308. prop="assessmentModelName"
  1309. label="考核模板"
  1310. width="300"
  1311. />
  1312. <el-table-column prop="name" label="更新时间" width="150" sortable>
  1313. <template #default="{ row }">
  1314. {{ dayjs(row.updateTime).format("YYYY-MM-DD HH:mm:ss") }}
  1315. </template>
  1316. </el-table-column>
  1317. <el-table-column label="操作" width="200" fixed="right">
  1318. <template #default="{ row }">
  1319. <!-- <el-button link :icon="Edit" /> -->
  1320. <el-icon @click="GoView(row)">
  1321. <View />
  1322. </el-icon>
  1323. </template>
  1324. </el-table-column>
  1325. </el-table>
  1326. <div class="flex justify-between item-center">
  1327. <div class="float-left mt-5 ml-2 total">
  1328. <!-- 共{{ initParams.total }}条数据 -->
  1329. </div>
  1330. <div class="float-right mt-5 mr-8">
  1331. <el-pagination
  1332. v-model:current-page="initParams.objParams.pageNumber"
  1333. v-model:page-size="initParams.objParams.pageSize"
  1334. background
  1335. layout="total, sizes, prev, pager, next, jumper"
  1336. :total="initParams.total"
  1337. @size-change="handleSizeChange"
  1338. @current-change="handleCurrentChange"
  1339. />
  1340. </div>
  1341. </div>
  1342. </el-tab-pane>
  1343. <el-tab-pane label="考核指标" name="second">
  1344. <div class="w-full flex items-center justify-between">
  1345. <div class="w-1/2 flex items-center justify-between">
  1346. <!-- <el-text class="w-1/5">考核模板</el-text> -->
  1347. <el-select
  1348. v-model="initParams.indexParams.modelName"
  1349. placeholder="请选择考核模板"
  1350. filterable
  1351. clearable
  1352. style="width: 400px"
  1353. @change="getAssessmentQuotaDetailsApi"
  1354. >
  1355. <el-option
  1356. v-for="itemTmp in initParams.tmpList"
  1357. :key="itemTmp.id"
  1358. :label="itemTmp.assessmentModelName"
  1359. :value="itemTmp.assessmentModelName"
  1360. />
  1361. </el-select>
  1362. <el-input
  1363. v-model="initParams.indexParams.userName"
  1364. class="ml-1"
  1365. placeholder="搜索"
  1366. @change="getAssessmentQuotaDetailsApi"
  1367. />
  1368. <el-input
  1369. v-model="initParams.indexParams.quotaName"
  1370. class="ml-2"
  1371. placeholder="搜索指标名称"
  1372. :prefix-icon="Search"
  1373. @change="getAssessmentQuotaDetailsApi"
  1374. />
  1375. </div>
  1376. <!-- <div class="-mr-">
  1377. <el-button type="primary" plain @click="automaticCollectionApi"
  1378. >同步最新数据</el-button
  1379. >
  1380. </div> -->
  1381. <div class="mr-10 flex items-center justify-between">
  1382. <el-button type="primary" plain @click="deleteMantList"
  1383. >批量删除</el-button
  1384. >
  1385. <el-button type="primary" plain @click="automaticCollectionApi"
  1386. >同步最新数据</el-button
  1387. >
  1388. <Auth :value="['批量导入指标']">
  1389. <el-button type="primary" plain @click="addsImport"
  1390. >批量导入</el-button
  1391. >
  1392. </Auth>
  1393. </div>
  1394. </div>
  1395. <vxe-table
  1396. ref="tableVxeRef"
  1397. class="mt-3"
  1398. show-overflow
  1399. keep-source
  1400. :edit-config="editConfig"
  1401. :edit-rules="validRules"
  1402. :data="initParams.Indexlist"
  1403. @edit-closed="editClosedEvent"
  1404. @checkbox-change="selectChangeEvent"
  1405. @checkbox-all="selectAllChangeEvent"
  1406. @selection-change="changeSelection"
  1407. @edit-disabled="editDisabledEvent"
  1408. >
  1409. <vxe-column type="checkbox" width="60" />
  1410. <vxe-column
  1411. v-if="state.tableType == 0 || state.tableType == 3"
  1412. field="realName"
  1413. fixed
  1414. title="人员"
  1415. width="100"
  1416. />
  1417. <!-- :员工,1:部门,2:医疗组,3:部门负责人 -->
  1418. <vxe-column
  1419. v-if="state.tableType == 0 || state.tableType == 3"
  1420. field="userName"
  1421. fixed
  1422. title="工号"
  1423. width="180"
  1424. />
  1425. <vxe-column
  1426. v-if="state.tableType == 0 || state.tableType == 3"
  1427. field="deptName"
  1428. fixed
  1429. title="部门"
  1430. width="180"
  1431. />
  1432. <vxe-column
  1433. v-if="state.tableType == 2"
  1434. field="userGroupName"
  1435. fixed
  1436. title="医疗组"
  1437. width="180"
  1438. />
  1439. <vxe-column
  1440. v-if="state.tableType == 2"
  1441. field="userGroupHospitalCode"
  1442. fixed
  1443. title="医疗组编号"
  1444. width="180"
  1445. />
  1446. <vxe-column
  1447. v-if="state.tableType == 1"
  1448. field="deptName"
  1449. fixed
  1450. title="部门"
  1451. width="180"
  1452. />
  1453. <vxe-column
  1454. v-if="state.tableType == 1"
  1455. field="deptHospitalCode"
  1456. fixed
  1457. title="部门编号"
  1458. width="200"
  1459. />
  1460. <vxe-column
  1461. field="assessmentModelName"
  1462. fixed
  1463. title="考核模板"
  1464. width="180"
  1465. />
  1466. <vxe-column field="name" fixed title="指标名称" width="180" />
  1467. <vxe-column field="scoreRule" fixed title="评价标准" width="180" />
  1468. <vxe-column field="source" fixed title="数据来源" width="180" />
  1469. <vxe-column
  1470. field="targetValue"
  1471. fixed
  1472. title="目标值"
  1473. :edit-render="{
  1474. name: 'input'
  1475. }"
  1476. width="180"
  1477. />
  1478. <vxe-column
  1479. field="addValue"
  1480. fixed
  1481. title="增幅"
  1482. :edit-render="{
  1483. name: 'input'
  1484. }"
  1485. width="180"
  1486. >
  1487. <template #default="{ row }">
  1488. <div @click="hangdleOpenClick(row)">
  1489. {{ row.addValue }}
  1490. </div>
  1491. </template>
  1492. </vxe-column>
  1493. <vxe-column
  1494. field="decValue"
  1495. fixed
  1496. title="降幅"
  1497. :edit-render="{
  1498. name: 'input'
  1499. }"
  1500. width="180"
  1501. >
  1502. <template #default="{ row }">
  1503. <div @click="hangdleOpenClick(row)">
  1504. {{ row.decValue }}
  1505. </div>
  1506. </template>
  1507. </vxe-column>
  1508. <vxe-column
  1509. field="challengeValue"
  1510. fixed
  1511. title="挑战值"
  1512. :edit-render="{
  1513. name: 'input'
  1514. }"
  1515. width="180"
  1516. >
  1517. <template #default="{ row }">
  1518. <div @click="hangdleOpenClick(row)">
  1519. {{ row.challengeValue }}
  1520. </div>
  1521. </template>
  1522. </vxe-column>
  1523. <vxe-column
  1524. field="startValue"
  1525. fixed
  1526. title="门槛值"
  1527. :edit-render="{
  1528. name: 'input'
  1529. }"
  1530. width="180"
  1531. >
  1532. <template #default="{ row }">
  1533. <div @click="hangdleOpenClick(row)">
  1534. {{ row.startValue }}
  1535. </div>
  1536. </template>
  1537. </vxe-column>
  1538. <vxe-column
  1539. field="upperValue"
  1540. fixed
  1541. title="上期完成值"
  1542. :edit-render="{
  1543. name: 'input'
  1544. }"
  1545. width="180"
  1546. >
  1547. <template #default="{ row }">
  1548. <div @click="hangdleOpenClick(row)">
  1549. {{ row.upperValue }}
  1550. </div>
  1551. </template>
  1552. </vxe-column>
  1553. <vxe-column
  1554. field="agupperValue"
  1555. fixed
  1556. title="上上期完成值"
  1557. :edit-render="{
  1558. name: 'input'
  1559. }"
  1560. width="180"
  1561. >
  1562. <template #default="{ row }">
  1563. <div @click="hangdleOpenClick(row)">
  1564. {{ row.agupperValue }}
  1565. </div>
  1566. </template>
  1567. </vxe-column>
  1568. <vxe-column
  1569. field="finalValue"
  1570. fixed
  1571. title="完成值"
  1572. :edit-render="{
  1573. name: 'input'
  1574. }"
  1575. width="180"
  1576. >
  1577. <template #default="{ row }">
  1578. <div @click="hangdleOpenClick(row)">
  1579. {{ convertToNumberIfPercentage(row.finalValue) }}
  1580. </div>
  1581. </template>
  1582. </vxe-column>
  1583. <vxe-column
  1584. field="score"
  1585. fixed
  1586. title="得分"
  1587. :edit-render="{
  1588. name: 'input'
  1589. }"
  1590. width="180"
  1591. >
  1592. <template #default="{ row }">
  1593. <div @click="hangdleOpenClick(row)">
  1594. {{ row.score }}
  1595. </div>
  1596. </template>
  1597. </vxe-column>
  1598. <vxe-column field="updateTime" title="更新时间" sortable width="180">
  1599. <template #default="{ row }">
  1600. {{ dayjs(row.updateTime).format("YYYY-MM-DD HH:mm:ss") }}
  1601. </template>
  1602. </vxe-column>
  1603. <vxe-column field="" title="操作" fixed="right" width="180">
  1604. <template #header>
  1605. 操作
  1606. <!-- 在表头操作后面添加图标 -->
  1607. <el-dropdown placement="top-start" trigger="click">
  1608. <el-icon class="mt-1 w-20 h-10">
  1609. <Setting />
  1610. </el-icon>
  1611. <template #dropdown>
  1612. <el-dropdown-menu>
  1613. <div class="w-[200px] p-1">
  1614. <div class="mt-2">
  1615. <el-text class="mx-1">表头设置</el-text>
  1616. </div>
  1617. <el-text type="info" size="small">可配置字段</el-text>
  1618. <div class="w-full">
  1619. <div class="w-full flex justify-evenly items-center">
  1620. <div class="w-24">
  1621. <el-text type="info" size="small">目标值</el-text>
  1622. </div>
  1623. <el-switch
  1624. v-model="showTargetValueSwitch"
  1625. size="small"
  1626. class="ml-2"
  1627. />
  1628. </div>
  1629. <div class="w-full flex justify-evenly items-center">
  1630. <div class="w-24">
  1631. <el-text type="info" size="small">增幅</el-text>
  1632. </div>
  1633. <el-switch
  1634. v-model="showAddValueSwitch"
  1635. size="small"
  1636. class="ml-2"
  1637. />
  1638. </div>
  1639. <div class="w-full flex justify-evenly items-center">
  1640. <div class="w-24">
  1641. <el-text type="info" size="small">降幅</el-text>
  1642. </div>
  1643. <el-switch
  1644. v-model="showDecValueSwitch"
  1645. size="small"
  1646. class="ml-2"
  1647. />
  1648. </div>
  1649. <div class="w-full flex justify-evenly items-center">
  1650. <div class="w-24">
  1651. <el-text type="info" size="small">挑战值</el-text>
  1652. </div>
  1653. <el-switch
  1654. v-model="showChallengeValueSwitch"
  1655. size="small"
  1656. class="ml-2"
  1657. />
  1658. </div>
  1659. <div class="w-full flex justify-evenly items-center">
  1660. <div class="w-24">
  1661. <el-text type="info" size="small">门槛值</el-text>
  1662. </div>
  1663. <el-switch
  1664. v-model="showStartValueSwitch"
  1665. size="small"
  1666. class="ml-2"
  1667. />
  1668. </div>
  1669. <div class="w-full flex justify-evenly items-center">
  1670. <div class="w-24">
  1671. <el-text type="info" size="small"
  1672. >上期完成值</el-text
  1673. >
  1674. </div>
  1675. <el-switch
  1676. v-model="showUpperValueSwitch"
  1677. size="small"
  1678. class="ml-2"
  1679. />
  1680. </div>
  1681. <div class="w-full flex justify-evenly items-center">
  1682. <div class="w-24">
  1683. <el-text type="info" size="small"
  1684. >上上期完成值</el-text
  1685. >
  1686. </div>
  1687. <el-switch
  1688. v-model="showAgupperValueSwitch"
  1689. size="small"
  1690. class="ml-2"
  1691. />
  1692. </div>
  1693. </div>
  1694. </div>
  1695. <el-dropdown-item>
  1696. <div class="mt-4 ml-20 mb-2 flex float-right">
  1697. <el-tag effect="light" class="mr-3" size="small"
  1698. >取消</el-tag
  1699. >
  1700. <el-tag
  1701. effect="dark"
  1702. size="small"
  1703. type="primary"
  1704. @click="setTableHeaderApi"
  1705. >确认</el-tag
  1706. >
  1707. </div>
  1708. </el-dropdown-item>
  1709. </el-dropdown-menu>
  1710. </template>
  1711. </el-dropdown>
  1712. </template>
  1713. <template #default="{ row }">
  1714. <el-icon @click="editIndexOpen(row)">
  1715. <Edit />
  1716. </el-icon>
  1717. </template>
  1718. </vxe-column>
  1719. </vxe-table>
  1720. <div class="flex justify-between item-center">
  1721. <div class="float-left mt-5 ml-2 total">
  1722. <!-- 共{{ initParams.total1 }}条数据 -->
  1723. </div>
  1724. <div class="float-right mt-5 mr-8">
  1725. <el-pagination
  1726. v-model:current-page="initParams.indexParams.pageNumber"
  1727. v-model:page-size="initParams.indexParams.pageSize"
  1728. background
  1729. layout="total, sizes, prev, pager, next, jumper"
  1730. :total="initParams.total1"
  1731. @size-change="handleSizeIndexChange"
  1732. @current-change="handleCurrentIndexChange"
  1733. />
  1734. </div>
  1735. </div>
  1736. </el-tab-pane>
  1737. <!-- <el-tab-pane label="统计分析" name="third">
  1738. </el-tab-pane> -->
  1739. <el-tab-pane label="基础信息" name="fourth">
  1740. <!-- 延迟加载获取id -->
  1741. <messagePerson v-if="messageData.id" :id="messageData.id" />
  1742. </el-tab-pane>
  1743. </el-tabs>
  1744. <!-- 添加被考核人 -->
  1745. <el-dialog
  1746. v-model="dialogVisibleAdd"
  1747. :title="changTitle()"
  1748. width="500"
  1749. :before-close="closePerson"
  1750. >
  1751. <div>
  1752. <el-form
  1753. ref="ruleFormRef"
  1754. label-position="top"
  1755. label-width="auto"
  1756. :model="addPersonParams"
  1757. >
  1758. <el-form-item
  1759. v-if="$props.message.assessmentType == 0"
  1760. label="人员"
  1761. label-position="top"
  1762. >
  1763. <el-tree-select
  1764. ref="assessmentTypeRef"
  1765. v-model="value1"
  1766. :data="convertDepartmentDataRecursive_Person(treeDept)"
  1767. multiple
  1768. :render-after-expand="false"
  1769. show-checkbox
  1770. style="width: 240px"
  1771. @check-change="handleRreeSelect"
  1772. />
  1773. </el-form-item>
  1774. <el-form-item
  1775. v-else-if="$props.message.assessmentType == 1"
  1776. label="科室"
  1777. label-position="top"
  1778. >
  1779. <el-tree-select
  1780. ref="assessmentTypeRef"
  1781. v-model="value1"
  1782. :data="dpetTree"
  1783. multiple
  1784. :render-after-expand="false"
  1785. show-checkbox
  1786. style="width: 240px"
  1787. @check-change="handleRreeSelect"
  1788. @check="handleNodeRreeSelect"
  1789. />
  1790. </el-form-item>
  1791. <el-form-item
  1792. v-else-if="$props.message.assessmentType == 2"
  1793. label="医疗组"
  1794. label-position="top"
  1795. >
  1796. <el-select
  1797. ref="selectRefs"
  1798. v-model="value1"
  1799. multiple
  1800. @change="handChange"
  1801. >
  1802. <el-option
  1803. v-for="(it, id) in treeDeptList"
  1804. :key="id"
  1805. :label="it.groupName"
  1806. :value="it.groupCode"
  1807. />
  1808. </el-select>
  1809. </el-form-item>
  1810. <el-form-item
  1811. v-else-if="$props.message.assessmentType == 3"
  1812. label="人员"
  1813. label-position="top"
  1814. >
  1815. <el-select
  1816. ref="selectRefs"
  1817. v-model="value1"
  1818. multiple
  1819. @change="handChange"
  1820. >
  1821. <el-option
  1822. v-for="(it, id) in treeDeptList"
  1823. :key="id"
  1824. :label="it.realName"
  1825. :value="it.userCode"
  1826. />
  1827. </el-select>
  1828. </el-form-item>
  1829. <el-form-item label="考核模板" label-position="top">
  1830. <el-select v-model="modulesValue" @change="handleModulesSelect">
  1831. <el-option
  1832. v-for="itemTmp in modulesList"
  1833. :key="itemTmp.id"
  1834. :label="itemTmp.tpName"
  1835. :value="itemTmp.id"
  1836. />
  1837. </el-select>
  1838. </el-form-item>
  1839. </el-form>
  1840. </div>
  1841. <template #footer>
  1842. <div class="dialog-footer w-full flex justify-between mt-4">
  1843. <div>
  1844. <el-button @click="closePerson">取消</el-button>
  1845. <el-button type="primary" @click="addPerson"> 确认 </el-button>
  1846. </div>
  1847. </div>
  1848. </template>
  1849. </el-dialog>
  1850. </div>
  1851. </template>
  1852. <style lang="scss" scoped>
  1853. .bg-icon {
  1854. display: flex;
  1855. align-items: center;
  1856. justify-content: center;
  1857. width: 45px;
  1858. height: 45px;
  1859. margin-right: 5px;
  1860. background: #00a870;
  1861. border-radius: 5px;
  1862. div {
  1863. // border: 1px solid red;
  1864. display: flex;
  1865. align-items: center;
  1866. justify-content: center;
  1867. width: 60%;
  1868. height: 60%;
  1869. color: #00a870;
  1870. background: #fff;
  1871. border-radius: 2px;
  1872. }
  1873. }
  1874. </style>