d3de4c02d250f169a9ea1dd4d280514ee2396121.svn-base 23 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490
  1. <!-- -->
  2. <template>
  3. <div>
  4. <el-row>
  5. <el-col :span="leftWidth" style="padding: 0;border-right: 1px solid #dcdfe6;"
  6. :style="{'height': colHeight + 'px'}">
  7. <el-container>
  8. <el-header style="height: 3vh;padding: 0 10px;line-height: 3vh;border-bottom:1px solid #dcdfe6;">
  9. <strong>稽察任务</strong>
  10. </el-header>
  11. <el-main style="padding:10px 0;">
  12. <el-row style="padding: 0 10px;">
  13. <el-input clearable placeholder="点击下列选项或输入关键字搜索" v-model="filterText">
  14. </el-input>
  15. </el-row>
  16. <el-row style="padding: 10px;">
  17. <el-form :inline="true" size="mini" class="demo-form-inline">
  18. <el-row>
  19. <el-col :span="24">
  20. <el-form-item label="年度">
  21. <el-select v-model="year" clearable style="width:100px;">
  22. <el-option :lable="item.year" :value="item.year" :key="item.id"
  23. v-for="item in yearList"></el-option>
  24. </el-select>
  25. </el-form-item>
  26. <el-form-item label="批次">
  27. <el-select v-model="batch" clearable style="width:100px;">
  28. <el-option :lable="item.batch" :value="item.batch" :key="item.id"
  29. v-for="item in pcList"></el-option>
  30. </el-select>
  31. </el-form-item>
  32. <el-button type="primary" size="mini" @click="treeSearch">查询</el-button>
  33. </el-col>
  34. </el-row>
  35. </el-form>
  36. </el-row>
  37. <el-row style="overflow-y:auto;padding: 0 10px;" :style="{'height': colHeight - 170 + 'px'}">
  38. <el-tree :highlight-current="true" class="filter_tree" :data="treeDataLists"
  39. :props="defaultProps" :default-expanded-keys="defaultExpanded"
  40. :filter-node-method="filterNode" node-key="id" @node-click='treeNodeClickHandler'
  41. ref="tree2">
  42. <span class="custom-tree-node" slot-scope="{ node }">
  43. <el-tooltip v-if="node.isLeaf" class="item" effect="dark" :content="node.label"
  44. placement="top-start">
  45. <span>{{ node.label }}</span>
  46. </el-tooltip>
  47. <span v-else>{{ node.label }}</span>
  48. </span>
  49. </el-tree>
  50. </el-row>
  51. </el-main>
  52. </el-container>
  53. </el-col>
  54. <el-col :span="rightWidth" style="border-right: 1px solid #dcdfe6;position:relative;padding: 10px;" :style="{'height': colHeight + 'px'}">
  55. <div style="text-align: right;padding-bottom: 10px;">
  56. <el-button type="primary" @click="searchBtn">查询</el-button>
  57. </div>
  58. <span style="float:left;color:red;font-size: 12px;">*(双击单元格编辑,红色背景单元格代表更改值未保存)</span>
  59. <el-table
  60. :data="tableData"
  61. border
  62. stripe
  63. :row-class-name="tableRowClassName"
  64. @row-dblclick="rowDbClick"
  65. v-loading='loading'
  66. :height="tableHeight">
  67. <el-table-column align="center" label="序号" prop="index">
  68. <template slot-scope="scope">{{scope.$index + 1}}</template>
  69. </el-table-column>
  70. <el-table-column align="center" label="稽察专家">
  71. <el-table-column align="center" label="专业" :formatter="formatExpertProf" prop="expertProf" show-overflow-tooltip min-width="120"></el-table-column>
  72. <el-table-column align="center" label="姓名" prop="expertName" show-overflow-tooltip min-width="120"></el-table-column>
  73. </el-table-column>
  74. <el-table-column align="center" label="测评指标">
  75. <el-table-column align="center" label="工作质量" prop="" show-overflow-tooltip min-width="120">
  76. <el-table-column
  77. align="center"
  78. label="业务水平:熟悉稽察工作流程和要求,专业经验丰富;熟练运用政策法规、规程规范,对本专业的突出可题应查尽查,熟练使用水利稽察工作信息系统和常见问题清单(30分)"
  79. prop="businessLevel"
  80. show-overflow-tooltip
  81. min-width="300">
  82. <template slot-scope="scope">
  83. <div @dblclick.stop v-if="scope.row.isEdit">
  84. <el-input-number v-model="scope.row.businessLevel" :min="0" :max="30" placeholder="请输入分数" style="width: 100%;"></el-input-number>
  85. </div>
  86. <span v-else>{{scope.row.businessLevel}}</span>
  87. </template>
  88. </el-table-column>
  89. <el-table-column
  90. align="center"
  91. label="现场成果质量: 定性准确,事实清楚,法规得当,证据确凿,责任主体明确,问题描述条理清晰、逻辑严密、格式规范(50分)"
  92. prop="qualityResults"
  93. show-overflow-tooltip
  94. min-width="300">
  95. <template slot-scope="scope">
  96. <div @dblclick.stop v-if="scope.row.isEdit">
  97. <el-input-number v-if="scope.row.isEdit" v-model="scope.row.qualityResults" :min="0" :max="50" placeholder="请输入分数" style="width: 100%;"></el-input-number>
  98. </div>
  99. <span v-else>{{scope.row.qualityResults}}</span>
  100. </template>
  101. </el-table-column>
  102. </el-table-column>
  103. <el-table-column align="center" label="工作作风" prop="" show-overflow-tooltip min-width="120">
  104. <el-table-column
  105. align="center"
  106. label="坚持原则、求真务实,敢于管理、敢于担当,积极主动团结协作;言行举止得体,维护稽察组形象;工作方法得当 (20分)"
  107. prop="workStyle"
  108. show-overflow-tooltip
  109. min-width="300">
  110. <template slot-scope="scope">
  111. <div @dblclick.stop v-if="scope.row.isEdit">
  112. <el-input-number v-model="scope.row.workStyle" :min="0" :max="20" placeholder="请输入分数" style="width: 100%;"></el-input-number>
  113. </div>
  114. <span v-else>{{scope.row.workStyle}}</span>
  115. </template>
  116. </el-table-column>
  117. </el-table-column>
  118. <el-table-column align="center" label="一票否决项" prop="" show-overflow-tooltip min-width="120">
  119. <el-table-column
  120. align="center"
  121. label="按注2填写(是/否)"
  122. prop="oneVeto"
  123. show-overflow-tooltip
  124. width="120">
  125. <template slot-scope="scope">
  126. <div @dblclick.stop v-if="scope.row.isEdit">
  127. <el-select v-model="scope.row.oneVeto" placeholder="请选择" style="width: 100%;">
  128. <el-option value="1" label="是"></el-option>
  129. <el-option value="0" label="否"></el-option>
  130. </el-select>
  131. </div>
  132. <span v-else>{{scope.row.oneVeto=='1'?'是':scope.row.oneVeto=='0'?'否':''}}</span>
  133. </template>
  134. </el-table-column>
  135. </el-table-column>
  136. </el-table-column>
  137. <el-table-column align="center" label="测评结果">
  138. <el-table-column align="center" label="总得分" prop="" show-overflow-tooltip min-width="120">
  139. <el-table-column
  140. align="center"
  141. label="优(95分-100分)良(85分-94分)合格 (75分-84分)不合格 (75分以下)"
  142. prop="g"
  143. show-overflow-tooltip
  144. width="150">
  145. <template slot-scope="scope">
  146. {{isNumber(scope.row.businessLevel)+isNumber(scope.row.qualityResults)+isNumber(scope.row.workStyle)}}
  147. </template>
  148. </el-table-column>
  149. </el-table-column>
  150. <el-table-column align="center" label="等级" prop="h" show-overflow-tooltip width="120">
  151. <template slot-scope="scope">
  152. <span v-if="(isNumber(scope.row.businessLevel)+isNumber(scope.row.qualityResults)+isNumber(scope.row.workStyle))>=95">优</span>
  153. <span v-else-if="(isNumber(scope.row.businessLevel)+isNumber(scope.row.qualityResults)+isNumber(scope.row.workStyle))>=85 && Math.floor(isNumber(scope.row.businessLevel)+isNumber(scope.row.qualityResults)+isNumber(scope.row.workStyle))<=94">良</span>
  154. <span v-else-if="(isNumber(scope.row.businessLevel)+isNumber(scope.row.qualityResults)+isNumber(scope.row.workStyle))>=75 && Math.floor(isNumber(scope.row.businessLevel)+isNumber(scope.row.qualityResults)+isNumber(scope.row.workStyle))<=84">合格</span>
  155. <span v-else-if="(isNumber(scope.row.businessLevel)+isNumber(scope.row.qualityResults)+isNumber(scope.row.workStyle))<75">不合格</span>
  156. <span v-else></span>
  157. </template>
  158. </el-table-column>
  159. <el-table-column align="center" label="备注说明" prop="i" show-overflow-tooltip min-width="120">
  160. <el-table-column
  161. align="center"
  162. label="等级不合格或存在票否决项,在本栏说明"
  163. prop="note"
  164. show-overflow-tooltip
  165. min-width="300">
  166. <template slot-scope="scope">
  167. <div @dblclick.stop v-if="scope.row.isEdit">
  168. <el-input v-model="scope.row.note" placeholder="请输入说明"></el-input>
  169. </div>
  170. <span v-else>{{scope.row.note}}</span>
  171. </template>
  172. </el-table-column>
  173. </el-table-column>
  174. </el-table-column>
  175. <el-table-column
  176. align="center"
  177. label="操作"
  178. fixed="right"
  179. width="220">
  180. <template slot-scope="scope">
  181. <el-button type="primary" size="mini" :disabled="!scope.row.isEdit" @click.stop="cancelRow(scope.row)">取消</el-button>
  182. <el-button type="primary" size="mini" :disabled="!scope.row.isEdit" @click.stop="submitRow(scope.row)">保存</el-button>
  183. </template>
  184. </el-table-column>
  185. </el-table>
  186. <div style="padding: 10px;letter-spacing: 1px;text-align: left;">
  187. 注:1一票否决项包括:①反中央八项规定及其实施细则情神、都建办技术处十不准 等有关要求的;②不服从工作安排的; ③泄露国家和被查单位机密、损害国家和被查单位
  188. 益,造成严重后果的;④在稽察过程中存在过错被投诉,经调查属实且造成严重后果的;⑤工作出现严重、失误的;⑥存在违法违纪行为的。存在一票否决项的填写对应序号,不存在一
  189. 票否决项问题的填写“无”。2测评人应本着实事求是、客观公正的原则进行次评。对填写明是不符合实际情况的测评人,经核实,在批次测评积分中和除1分-5分。3 察工作结束前,请
  190. 测评人将该表填写完整后点击左上角保存。
  191. </div>
  192. </el-col>
  193. </el-row>
  194. </div>
  195. </template>
  196. <script>
  197. import request from '../../../utils/gw_ajax_request'
  198. import { hostUrl } from '@util/global_variable.js'
  199. export default {
  200. //import引入的组件需要注入到对象中才能使用
  201. components: {
  202. },
  203. data() {
  204. //这里存放数据
  205. return {
  206. tableData:[],
  207. loading:false,
  208. stateName: '', //状态名称
  209. leftWidth: 5,
  210. rightWidth: 19,
  211. isOpen: true,
  212. tbsm: true,
  213. jbxxAndWtqd: false,
  214. reportTable: false,
  215. defaultExpanded: [],//树默认展开节点数组
  216. curComponent: "InstructionManual",
  217. professionName: '前期与设计',
  218. professionType: '',//专业类型
  219. professionChildrenTableName: {},
  220. rightTableName: '填报说明',
  221. currentNodeId: '',//点击树的节点登记表ID
  222. inspGroupId: '',//点击树的节点组ID
  223. pertype: '',//稽察填报人员类型,用于控制表格上方菜单控制
  224. objId: '',//点击树节点的objId
  225. tableSrc: '',//报表的链接
  226. menuDisNum: 'all',//用于控制表格上方菜单项的显示隐藏的数组下标
  227. projectName: '',//点击树的工程名称
  228. colHeight: window.innerHeight - 90,
  229. tableHeight: window.innerHeight - 240,
  230. filterText: '',
  231. year: "",
  232. batch: "",
  233. yearList: [],
  234. pcList: [],
  235. treeDataLists: [],
  236. defaultProps: {
  237. children: 'children',
  238. label: 'pnm'
  239. },
  240. showSubmitBtn: true,
  241. backStatus: false,
  242. exportWordDialog: false,
  243. reallMenuLists: [],//菜单实际用的数组
  244. isClicked: false,
  245. currentRow:undefined,
  246. isSubmit:false,
  247. };
  248. },
  249. //监听属性 类似于data概念
  250. computed: {
  251. persId() {
  252. return localStorage.getItem("userid")
  253. ? localStorage.getItem("userid")
  254. : "1098101939614724096";
  255. },
  256. hasPriv() {
  257. return this.ownPriv('manage')
  258. },
  259. roleTypeData(){
  260. return this.$store.state.jcState.roleTypeData;
  261. }
  262. },
  263. //监控data中的数据变化
  264. watch: {
  265. filterText(val) {
  266. this.$refs.tree2.filter(val);
  267. }
  268. },
  269. //方法集合
  270. methods: {
  271. formatExpertProf(row,column){
  272. var name = [];
  273. var str = row[column.property];
  274. if(str){
  275. this.roleTypeData.forEach((item)=>{
  276. if(str.indexOf(item.value)>-1){
  277. name.push(item.label);
  278. }
  279. })
  280. }
  281. return name.join(",");
  282. },
  283. searchBtn(){
  284. this.initTable();
  285. },
  286. sumScore(obj){
  287. var score = this.isNumber(obj.businessLevel)+this.isNumber(obj.qualityResults)+this.isNumber(obj.workStyle);
  288. obj.score = score;
  289. if(score>=95){
  290. obj.evalLevel = "优";
  291. }else if(score>=85 && Math.floor(score)<=94){
  292. obj.evalLevel = "良";
  293. }else if(score>=75 && Math.floor(score)<=84){
  294. obj.evalLevel = "合格";
  295. }else{
  296. obj.evalLevel = "不合格";
  297. }
  298. },
  299. isNumber(v){
  300. if(v){
  301. if(!isNaN(parseFloat(v))){
  302. return parseFloat(v);
  303. }else{
  304. return 0;
  305. }
  306. }else{
  307. return 0;
  308. }
  309. },
  310. styleBack({ row, column, rowIndex, columnIndex }) {
  311. if(row.isEdit==true && this.currentRow!=undefined && row[column.property] && (column.property=="businessLevel" || column.property=="qualityResults" || column.property=="workStyle")){
  312. if(row[column.property]!=this.currentRow[column.property]){
  313. return { background: "#fd2528" };
  314. }
  315. }
  316. },
  317. initTable(){
  318. var _self = this;
  319. var obj = {
  320. groupId:this.inspGroupId,
  321. projId:this.currentNodeId
  322. }
  323. request.post(`/tac/evalation/expert/todo/eval/list`, obj).then(res => {
  324. if (res.success) {
  325. if(res.data && res.data.length>0){
  326. res.data.forEach((item)=>{
  327. item.isEdit = false;
  328. item.businessLevel = (item.businessLevel || item.businessLevel===0)?item.businessLevel:30,
  329. item.qualityResults = (item.qualityResults || item.qualityResults===0)?item.qualityResults:50,
  330. item.workStyle = (item.workStyle || item.workStyle===0)?item.workStyle:20
  331. })
  332. }
  333. _self.tableData = res.data;
  334. _self.currentRow = undefined;
  335. }
  336. })
  337. },
  338. cancelRow(row){
  339. for (const key in this.currentRow) {
  340. if(key!="index" && key!="isEdit"){
  341. row[key] = this.currentRow[key];
  342. }
  343. }
  344. row.isEdit = false;
  345. },
  346. submitRow(row){
  347. var str = JSON.stringify(row);
  348. var obj = JSON.parse(str);
  349. obj.projId = this.currentNodeId;
  350. this.sumScore(obj);
  351. request.post(`/tac/evalation/expert/`, obj).then(res => {
  352. if (res.success) {
  353. this.initTable();
  354. }else{
  355. this.$message.warning(res.message);
  356. }
  357. })
  358. },
  359. tableRowClassName ({row, rowIndex}) {
  360. row.index = rowIndex;
  361. return "currentEdit"
  362. },
  363. rowDbClick(row, column, event){
  364. row.isEdit = true;
  365. if(this.currentRow!=undefined){
  366. this.tableData.forEach((item,index)=>{
  367. if(this.currentRow.index==index){
  368. for (const key in this.currentRow) {
  369. if(key!="index" && key!="isEdit"){
  370. item[key] = this.currentRow[key];
  371. }
  372. }
  373. }
  374. })
  375. }
  376. var obj = JSON.stringify(row);
  377. this.currentRow = JSON.parse(obj);
  378. this.tableData.forEach((item,index)=>{
  379. if(row.index!=index){
  380. item.isEdit = false;
  381. }
  382. })
  383. },
  384. async getYearPc() {
  385. await request.post(`/tac/insp/year/list`, {}).then(res => {
  386. if (res.success) {
  387. this.$nextTick(() => {
  388. this.yearList = res.data;
  389. })
  390. }
  391. })
  392. request.post(`/tac/insp/batch/list`, {}).then(res => {
  393. if (res.success) {
  394. this.pcList = res.data;
  395. }
  396. })
  397. },
  398. filterNode(value, data) {
  399. if (!value) return true;
  400. return data.pnm.indexOf(value) !== -1;
  401. },
  402. //获取左侧树数据
  403. getTreeData: function () {
  404. let _self = this;
  405. request.post(`/tac/insp/year/batch/obj/getObjTreeListV2`, {
  406. "persId": _self.persId,
  407. "year": _self.year,
  408. "batch": _self.batch,
  409. "isEval": "1",
  410. }).then(res => {
  411. _self.treeDataLists = res.data.children;
  412. })
  413. },
  414. //左侧树搜索
  415. treeSearch() {
  416. this.getTreeData();
  417. },
  418. //树节点点击事件
  419. treeNodeClickHandler: function (data, node, tree) {
  420. if (node.childNodes.length == 0) {
  421. this.currentNodeId = data.objId;
  422. this.inspGroupId = node.parent.data.pid;
  423. this.initTable();
  424. } else {
  425. return;
  426. }
  427. }
  428. },
  429. //生命周期 - 创建完成(可以访问当前this实例)
  430. created() {
  431. },
  432. //生命周期 - 挂载完成(可以访问DOM元素)
  433. mounted() {
  434. this.getTreeData();
  435. this.getYearPc();
  436. },
  437. beforeCreate() { }, //生命周期 - 创建之前
  438. beforeMount() { }, //生命周期 - 挂载之前
  439. beforeUpdate() { }, //生命周期 - 更新之前
  440. updated() { }, //生命周期 - 更新之后
  441. beforeDestroy() { }, //生命周期 - 销毁之前
  442. destroyed() { }, //生命周期 - 销毁完成
  443. activated() { }, //如果页面有keep-alive缓存功能,这个函数会触发
  444. }
  445. </script>
  446. <style lang="scss" scoped>
  447. .currentEdit{
  448. background: red;
  449. }
  450. .filter_tree {
  451. .el-tree-node__label {
  452. color: #666;
  453. font-size: large;
  454. }
  455. }
  456. .filter_tree.el-tree--highlight-current .el-tree-node.is-current>.el-tree-node__content {
  457. background-color: #c7e9fe;
  458. }
  459. .assistant_btn {
  460. position: absolute;
  461. bottom: -10px;
  462. right: 20px;
  463. z-index: 999;
  464. }
  465. .open_board {
  466. position: absolute;
  467. bottom: 0;
  468. left: 0;
  469. width: 24px;
  470. height: 30px;
  471. line-height: 30px;
  472. border: solid 1px #ddd;
  473. border-top-right-radius: 5px;
  474. border-bottom-right-radius: 5px;
  475. text-align: center;
  476. background-color: #bbebff;
  477. cursor: pointer;
  478. }
  479. </style>